应用程序崩溃使用PeoplePicker,但不是在相同的视图

更新2,我希望这可以帮助别人,有一个解决scheme在以下链接: https : //discussions.apple.com/thread/5498630? start =0& tstart =0 ,显然这是一个iOS错误,这个工作。 我可以创build新的sharedPicker,但是我不能从中得到任何东西或者解雇它,我不确定如何格式化超出链接提供的内容任何帮助都是非常受欢迎的。

所以我现在的问题是如何采取下面的代码,并实际上创buildpeoplePickerNavigationControllerDidCancel的代码:和peoplePickerNavigationController:shouldContinueAfterSelectingPerson:谢谢。 我留下了大部分原来的post,以防有人有类似的模糊问题。

// Convoluted workaround for the iPhone 4S crash + (ABPeoplePickerNavigationController *)sharedPeoplePicker { static ABPeoplePickerNavigationController *_sharedPicker = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedPicker = [[ABPeoplePickerNavigationController alloc] init]; }); return _sharedPicker; } // then later on, use [YourController sharedPeoplePicker].delegate = self; // etc. 

我目前的代码:

 - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { [self displayPerson:person]; [self.navigationController dismissViewControllerAnimated:YES completion:nil]; return NO; } - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { //[self dismissViewControllerAnimated:YES completion:nil]; [self.navigationController dismissViewControllerAnimated:YES completion:nil]; } - (IBAction)pick1:(id)sender { ABPeoplePickerNavigationController *picker1 =[[ABPeoplePickerNavigationController alloc] init]; picker1.peoplePickerDelegate = self; [self presentViewController:picker1 animated:YES completion:nil]; x=1; } 

更新1,这个应用程序崩溃在iPhone 4 / 4s,但运行在模拟器和iPhone5,如果这意味着什么。 我在想,只要他们有足够的力量来克服我所创造的任何漏洞

我有一个视图控制器的iOS应用程序,用户可以使用ABPeoplePickerNavigationController为应用程序select联系人或手动input数字。 如果手动input号码,则没有问题。 如果用户打开并且:

  1. 从地址簿中select一个新的联系人

  2. 更新地址簿中的联系人以在应用程序中使用

  3. 打开并取消地址簿(全部不保存操作)

然后,我无法导航到我的应用程序中的一个特定的视图,没有崩溃。 我不知道为什么我不能去这个视图控制器,或者为什么它导致崩溃。

我正在使用5个不同的选取器,每个我想要添加和可能保存的联系人。 我保存为NSUserDefaults ,但正如我所说,即使select器select从未保存,崩溃仍然存在。 我可以从侧边栏导航浏览到应用程序中的所有视图,没有发生任何事情,唯一不同的视图我失败的是,它是从一个主视图控制器,而不是我的侧边栏。

我感谢任何帮助或想法。 这是我写的第一个应用程序,我试图更新和失败。 我想再次得到它的function,所以我可以回来重构它。

我的实现:

  - (IBAction)pick1:(id)sender { ABPeoplePickerNavigationController *picker1 = [[ABPeoplePickerNavigationController alloc] init]; picker1.peoplePickerDelegate = self; [self presentViewController:picker1 animated:YES completion:nil]; x = 1; } - (IBAction)pick2:(id)sender { ABPeoplePickerNavigationController *picker2 = [[ABPeoplePickerNavigationController alloc] init]; picker2.peoplePickerDelegate = self; [self presentViewController:picker2 animated:YES completion:nil]; x=2; } - (IBAction)pick3:(id)sender { ABPeoplePickerNavigationController *picker3 = [[ABPeoplePickerNavigationController alloc] init]; picker3.peoplePickerDelegate = self; [self presentViewController:picker3 animated:YES completion:nil]; x=3; } - (IBAction)pick4:(id)sender { ABPeoplePickerNavigationController *picker4 = [[ABPeoplePickerNavigationController alloc] init]; picker4.peoplePickerDelegate = self; [self presentViewController:picker4 animated:YES completion:nil]; x=4; } - (IBAction)pick5:(id)sender { ABPeoplePickerNavigationController *picker5 = [[ABPeoplePickerNavigationController alloc] init]; picker5.peoplePickerDelegate = self; [self presentViewController:picker5 animated:YES completion:nil]; x=5; } - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { [self displayPerson:person]; [self.navigationController dismissViewControllerAnimated:YES completion:nil]; return NO; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { return NO; } - (void)displayPerson:(ABRecordRef)person { NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty); NSString* phone = nil; ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty); if (ABMultiValueGetCount(phoneNumbers) > 0) { phone = (__bridge_transfer NSString*) ABMultiValueCopyValueAtIndex(phoneNumbers, 0); } else { phone = @"[None]"; } if (x==1){ firstName1.text = name; contact1.text = phone; } if (x==2){ firstName2.text = name; contact2.text = phone; } if (x==3){ firstName3.text = name; contact3.text = phone; } if (x==4){ firstName4.text = name; contact4.text = phone; } if (x==5){ firstName5.text = name; contact5.text = phone; } } 

很抱歉回答我自己的问题,但另一个解决这个问题的方法是使用CF保留来纠正我所遇到的过度释放。 我保留了这个人和那个人,一切都解决了。 感谢所有试图帮助我解决这个问题的人。

 - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { [self.navigationController dismissViewControllerAnimated:YES completion:nil]; CFRetain((__bridge CFTypeRef)(peoplePicker)); } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { [self displayPerson:person]; [self.navigationController dismissViewControllerAnimated:YES completion:nil]; CFRetain(person); CFRetain((__bridge CFTypeRef)(peoplePicker)); return NO; } 

感谢您解决此问题的工作。 你的方法#2真的有效! 我有类似的情况在https://discussions.apple.com/thread/5498630?start=0&tstart=0中讨论:MKMapView由IB放置在故事板中,除IBOutlet外没有代码。 我介绍ABPeoplePickerController然后简单地取消它并通过导航离开这个视图。 然后返回并得到内存问题:在被驳回的ABPeoplePickerController的地址处称为僵尸UINavigationBar的方法barStyle。 这种情况只发生在iOS 7(iPad 3rd 10和iPhone 4S)上,但代码在iOS 6(iPhone 3GS)上正常工作,只能与MKMapView结合使用。 我用WebView而不是MapViewtesting,一切正常。 我认为这是iOS 7真正的bug。亲切的问候阿列克谢

那么,这也是一个更简单的解决scheme。 实际的问题是使用ABPeoplePickerNavigationController作为单例对象,将其ABPeoplePickerNavigationController设置为视图控制器,然后closures视图控制器。 所以,在我的情况下,工作的解决scheme是这样的:

 - (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { peoplePicker.peoplePickerDelegate = nil; // clear delegate prior to dismissing self [self.navigationController dismissViewControllerAnimated:YES completion:nil]; } - (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { [self displayPerson:person]; peoplePicker.peoplePickerDelegate = nil; // clear delegate prior to dismissing self [self.navigationController dismissViewControllerAnimated:YES completion:nil]; return NO; }