2009-06-04 5 views
1

Я представляю пользователю ABPeoplePickerNavigationController и прошу их выбрать контакт. Когда они выбирают пользователя, я хочу, чтобы они были отправлены либо в приложение «Сообщения», либо в приложение «Электронная почта» в зависимости от того, какое свойство они выбрали. Однако я не могу понять, как настроить действие, которое происходит после отклонения модального выбора.Пользовательские действия после ABPeoplePickerNavigationController отклоняется

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier { 
    if(property == kABPersonPhoneProperty){ 
     [self dismissModalViewControllerAnimated:YES]; 
     NSString* phoneNumber = (NSString *)ABRecordCopyValue(person, property); 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"sms:%@", phoneNumber]]; 
     [[UIApplication sharedApplication] openURL:url]; 
     [phoneNumber release]; 
     return NO; 
    } 

    if(property == kABPersonEmailProperty){ 
     [self dismissModalViewControllerAnimated:YES]; 
     NSString* emailAddress = (NSString *)ABRecordCopyValue(person, property); 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", emailAddress]]; 
     [[UIApplication sharedApplication] openURL:url]; 
     [emailAddress release]; 
     return NO; 
    } 
    return YES; 
} 

Итак, как это сделать? Спасибо!

ответ

0

Решено. Проблема не в методах делегата. Было то, что созданный мной NSURL недействителен. Чтобы запустить приложение SMS/Messaging с выбранным номером телефона, пользователь sms: // ... // является ключом! Документы, как представляется, указывают смс: как правильный формат, но я обнаружил, что это неверно.

0

Вы можете создать собственный протокол с двумя методами (например, selectedPhone и selectedMail), а класс, вызывающий этот, реализовать эти процедуры и назначить себя как делегат. После того, как решение принято, вы проверяете, определяется ли делегат, затем вызывают правильный метод и позволяют вызывающему агенту обрабатывать, что с ним делать.

Кроме того, вы должны провести некоторое тестирование по URL-адресу sms. Последнее, что я проверил, запускает приложение SMS, но ничего не передает ему.

Но до того, как вы доберетесь до вас, позвонив этим openURLs для вызова внешних приложений для телефона или электронной почты, ваше приложение будет остановлено, и управление будет передано этим приложениям. Поэтому я не уверен, почему вы заботитесь о том, что происходит после того, как пользователь отклоняет выбор модала, потому что ваше приложение больше не будет рядом.

Теперь под OS 3.0 у вас могут быть некоторые параметры, но все же ... вы можете пересмотреть проблему.

+0

Я знаю, что мое приложение будет терять контроль. Я пытаюсь перехватить выбор свойства, чтобы настроить электронную почту, которая открывается. Я могу задать предмет/тело для пользователя в качестве удобства.Кроме того, если они выбирают номер телефона, я хочу, чтобы приложение SMS отображалось, а не приложение «Телефон». Таким образом, мне нужно перехватить его, а затем вызвать соответствующий openURL. – Georges

2

Вам нужно просто реализовать метод делегат

- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue 

В реализации просто вернуть YES (если вам не нужно обрабатывать выбранное свойство). Затем, если пользователь коснулся номера телефона, ваше приложение начнет звонить по этому номеру телефона. Аналогично, если пользователь коснулся адреса электронной почты, приложение будет переключено на представление электронной почты по умолчанию.

Не забудьте назначить себя в качестве делегата, в противном случае mthod не будет называться:

ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; 
peoplePicker.peoplePickerDelegate = self; 
[self presentModalViewController:peoplePicker animated:YES]; 

И, наконец, положить ABPeoplePickerNavigationControllerDelegate в разделе протокольного файла заголовка вашего контроллера.

ПРИМЕЧАНИЕ: вы должны проверить это на устройстве, а не на симуляторе.

+0

Спасибо за ответ. Я немного смущен, потому что метод, который вы предложили реализовать, находится в протоколе ABPersonViewControllerDelegate, а не в протоколе PeoplePicker. Я установил свой контроллер как делегат для ABPeoplePickerNavigationController, и эти методы вызывается правильно, но метод делегирования ABPersonViewController никогда не вызывается. Я предполагаю, что это связано с тем, что я не установил свой контроллер как делегат для ABPersonViewControllers, который создается экземпляром ABPeoplePickerNavigationController. Вы знаете, как настроить это? – Georges

+0

Как только пользователь выбирает контакт, вам просто нужно инициализировать/назначить ABPersonViewController, чтобы его делегат и человек были показаны (контакт, выбранный вашим пользователем), , затем нажмите его в стеке. Затем при нажатии на номер телефона или адрес электронной почты будет инициировано действие по умолчанию. –

0

Просто вернуть NO/FALSE/ложь в

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

и писать код в той же функции для контактной обработки

Смежные вопросы