Nano Hash - криптовалюты, майнинг, программирование

Не могу выбрать контакт на iOS 8

У меня есть подкласс ABPeoplePickerNavigationController для обработки выбора контактного номера телефона в моем приложении. Все отлично работает на iOS 7 и ниже.

Однако в iOS 8 мой ABPeoplePickerNavigationControllerDelegate не попадает при выборе номера телефона. Вместо этого он просто звонит по этому номеру телефона.

Я заметил, что метод, который я использовал для обработки выбора контактов в iOS 7 (peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:), устарел в iOS 8. Этот метод был заменен на peoplePickerNavigationController:didSelectPerson:property:identifier:.

Я знаю, что мой делегат установлен, потому что я успешно получил обратный вызов метода peoplePickerNavigationControllerDidCancel:.

Кто-нибудь еще сталкивался с этой проблемой?

Вот фрагмент кода моего подкласса ABPeoplePickerNavigationController:

- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {

    [self peoplePickerNavigationController:peoplePicker shouldContinueAfterSelectingPerson:person property:property identifier:identifier];
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {

    ...do stuff...

    return NO;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    return YES;
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {

    [self dismissViewControllerAnimated:self.shouldAnimateDismiss completion:NULL];
}
24.09.2014

  • Что вы указали predicateForSelectionOfProperty? 24.09.2014
  • Вы строите с помощью Xcode 6, и у вашего проекта есть базовый SDK для iOS 8? 24.09.2014
  • @ Роб Ничего. Это всегда работало без установки этого. 24.09.2014
  • @rmaddy да и да. 24.09.2014
  • ХОРОШО. В iOS 8 predicateForSelectionOfProperty тоже влияет на это поведение, поэтому я должен был спросить. Во всяком случае, вы подтвердили (с точками останова или операторами журнала), что эти методы делегата вообще вызываются? Например. правильно ли было указано peoplePickerDelegate (заметьте, не delegate)? 24.09.2014
  • И код из вашего вопроса был фактически скопирован и вставлен из вашего реального кода? Просто убедитесь, что в вашем реальном коде нет крошечной опечатки в имени метода делегата. 24.09.2014
  • @rmaddy Да, за исключением той части, в которой говорится, делай что-нибудь ... очевидно. 24.09.2014
  • @Rob Да, я даже упомянул в вопросе, что мой метод отмены делегата срабатывает. Затем у меня есть точки останова в моих методах выбора, и я проверил, что они никогда не срабатывают. 24.09.2014

Ответы:


1

Где вы указываете peoplePickerDelegate?

В iOS 8, если вы укажете peoplePickerDelegate в viewDidLoad, вы столкнетесь с описанным вами любопытным поведением (отмена делегирования работает, didSelect... и shouldContinue... нет). Если указать peoplePickerDelegate сразу после init (или во время), все работает нормально.

Похоже, это «функция» iOS 8. Я отправлю отчет об ошибке.

24.09.2014
  • Это была моя проблема. Спасибо!! Это действительно очень любопытное изменение. 25.09.2014
  • Моя проблема заключалась в том, что я указывал picker.delegate = self вместо picker.peoplePickerDelegate = self. 04.11.2014
  • @Rob Здравствуйте, сэр, у меня все хорошо в моем проекте, я указываю peoplePickerDelegate методом нажатия кнопки, но теперь метод отмены работает нормально, но (BOOL) peoplepickernavigationcontroller не вызывается. 22.01.2016

  • 2

    вышеуказанные два метода делегирования устарели в ios 8.0, используйте два последних метода для  получение желаемого результата

    выше два метода делегирования устарели в iOS 8.0, используйте последние два метода для получения желаемого результата

    это ссылка на руководство для разработчиков Apple, которая даст вам больше информации о

    ABPeoplePickerNavigationControllerDelegate

    03.12.2014

    3

    Ничего не произойдет, когда я выберу контакт в IOS8.

    Я обнаружил, что помимо

    if ([picker respondsToSelector:@selector(setPredicateForSelectionOfPerson:)]) 
        {
             picker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count = 1"];
        }
    

    мне тоже нужно

    if ([picker respondsToSelector:@selector(setPredicateForEnablingPerson:)])
        {
            picker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
        }
    

    Источник https://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html

    17.12.2014

    4

    Если вы хотите просто получить имя человека, вы можете сделать это:

    -(IBAction)btnGetContact{
        ABPeoplePickerNavigationController *personPicker = [ABPeoplePickerNavigationController new];
        personPicker.peoplePickerDelegate = self;
        [self presentViewController:personPicker animated:YES completion:nil];
    }
    
    -(void)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
            NSString *firstName;
        NSString *middleName;
        NSString *lastName;
        UIImage *retrievedImage;
    
        // get the first name
        firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    
        //get the middle name
        middleName = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonMiddleNameProperty);
    
        // get the last name
        lastName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);
    
        // get personPicture
        if (person != nil && ABPersonHasImageData(person))
        {
            retrievedImage = [UIImage imageWithData:(__bridge_transfer NSData*)ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail)];
        }
        else
        {
            retrievedImage = nil;
        }
    }
    

    Но если вы хотите перейти к сведениям о человеке, чтобы получить номера людей, вы должны использовать BOOL вместо void для peoplePickerNavigationController и передать YES, как показано ниже:

    -(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
        return YES;
    }
    
    
    
     -(void) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker didSelectPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
            ABMutableMultiValueRef phoneno  = ABRecordCopyValue(person, kABPersonPhoneProperty);
    
    CFStringRef phone = ABMultiValueCopyValueAtIndex(phoneno, identifier);
    
            _mPhone.text = (__bridge NSString *)phone;
    
            [self dismissViewControllerAnimated:NO completion:^(){}];
        }
    

    Также не забудьте импортировать AddressBook.framework и AddressBookUI.framework в свой проект и ABPeoplePickerNavigationControllerDelegate ,

    #import <AddressBook/AddressBook.h>
    #import <AddressBookUI/AddressBookUI.h>
    

    в ваш заголовочный файл.

    14.07.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..