6

更新 2,我希望这对某人有所帮助,以下链接有一个解决方案:https ://discussions.apple.com/thread/5498630?start=0&tstart=0 ,显然这是一个 iOS 错误,并且可以解决。我可以创建新的 sharedPicker,但我无法从中获取任何内容或将其关闭,我不确定如何格式化超出链接中提供的格式 ,非常欢迎任何帮助。

所以我现在的问题是如何获取以下代码并实际为 peoplePickerNavigationControllerDidCancel: 和 peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 创建代码:谢谢。我已经留下了我原来的大部分帖子,以防有人有类似的模糊问题。

// 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或手动输入数字来选择应用程序的联系人。如果手动输入数字,则没有问题。如果用户打开并且:

  1. 从通讯录中选择一个新联系人

  2. 更新通讯录中的联系人以在应用程序中使用

  3. 打开和取消通讯录(全部不保存动作)

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

我正在使用 5 个不同的选择器,一个用于我想要添加并可能保存的每个联系人。我另存为NSUserDefaults,但就像我说的那样,即使选择器选择从未保存,崩溃仍然存在。我可以毫无意外地从侧边栏导航导航到应用程序中的所有视图,我失败的视图的唯一不同之处在于它是从一个主视图控制器而不是我的侧边栏呈现的。

我感谢任何帮助或想法。这是我编写的第一个应用程序,我正在尝试更新它并失败了。我想让它再次发挥作用,这样我就可以回来重构它。

我的实现:

    - (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;
    }

}
4

3 回答 3

3

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

- (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;

}
于 2013-11-24T22:45:32.337 回答
1

感谢您解决此问题。你的方法#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 而不是 MapView 进行测试,一切正常。我认为这是 iOS 7 中的真正错误。 亲切的问候 Alexey

于 2013-12-07T17:18:16.690 回答
0

好吧,还有一个更简单的解决方案。实际问题是ABPeoplePickerNavigationController作为单例对象使用,将其委托设置为视图控制器,然后关闭视图控制器。所以,在我的情况下,有效的解决方案是这个:

- (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;
}
于 2014-05-27T16:18:49.843 回答