2013-11-22 1 views
6

Обновление 2, я надеюсь, что это поможет кому-то, есть решения по следующей ссылке: https://discussions.apple.com/thread/5498630?start=0&tstart=0, очевидно, это ошибка iOS, и эта работа работает. Я могу создать новый sharedPicker, но я ничего не могу получить от него или отклонить, я не уверен, как форматировать за пределы того, что предоставляется по ссылке Любая помощь по этому поводу очень приветствуется.Ошибка приложения при использовании PeoplePicker, но не в том же виде

Так что мой вопрос в том, как взять следующий код и фактически создать код для 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; 
} 

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

} 
+0

И где именно он падает? Вероятно, вы не сохраняете некоторые переменные. –

+0

Если я отредактирую этот код, мое приложение будет работать нормально, просто требуется ввести номера телефонов вручную. Что касается отладки, я получаю F, я не могу понять ничего, что говорит Xcode, и все, что я получаю сейчас, это lldb. Я вернусь и проверю свою экономию, но то, что убивает меня, я использую один метод для сохранения независимо от метода ввода, и даже если я просто подниму представление сборщика и не буду сохранять его, я могу отменить его, мое приложение будет по-прежнему сбой, когда я перехожу к этому конкретному виду. –

+0

Дополнительная информация: У меня есть серия контроллеров, встроенных в контроллер навигации. С главного экрана я могу перемещаться в любом месте без проблем. Если я открою PeoplePicker на контроллере представления контактов, вернитесь домой, чтобы начать контакт, мое приложение выйдет из строя. Это происходит независимо от действий, предпринятых с PeoplePicker. Когда я снова открою приложение, он будет нормально работать на всех экранах, пока я снова не открою PeoplePicker? Является ли эта проблема выпуском релиза? –

ответ

3

К сожалению ответить на мой собственный вопрос, но другой работы вокруг этого, что требует мало изменений, чтобы использовать 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; 

} 
+1

С оговоркой, что он будет просачиваться после исправления основной ошибки, да? Обходной путь синглтона, по-видимому, позволяет избежать этой проблемы. – JLundell

1

Благодарим вас за работу вокруг этой проблемы. Ваш метод # 2 действительно работает !!! У меня подобная ситуация обсуждалась в https://discussions.apple.com/thread/5498630?start=0&tstart=0: MKMapView помещается IB в раскадровку, без кода, кроме IBOutlet. Я представляю ABPeoplePickerController, а затем просто отменю его, уволив и оставлю это представление с помощью навигации. Затем вернитесь назад и получите проблему с памятью: вызванный метод barStyle зомби UINavigationBar по адресу отклоненного ABPeoplePickerController. Эта ситуация произошла только на iOS 7 (iPad 3rd ten и iPhone 4S), но код отлично работает на iOS 6 (iPhone 3GS) и только с комбинацией с MKMapView. Я тестирую WebView вместо MapView, и все работает нормально. Я думаю, что это настоящая ошибка в iOS 7. С уважением Alexey

0

Ну, есть также немного более простое решение. Фактическая проблема заключается в использовании ABPeoplePickerNavigationController в качестве объекта singleton, установив его делегата на контроллер представления и затем отклоняя контроллер вида. Таким образом, в моем случае решение, которое сработало, является следующим:

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