ios: компоновщик смс-сообщений не отображается

У меня есть UITableViewController, представляющий список контактов, когда пользователь выбирает строку, он покажет UIActionSheet, чтобы спросить пользователя о действии (позвонить, отправить смс...).

Пользователь выбирает действие, и этот первый UIActionSheet покажет другой UIActionSheet, содержащий номера телефонов.

Пользователь выбирает номер телефона, и это должно показать составитель SMS-сообщения.

Проблема в том, что когда пользователь выбирает номер телефона, представление компоновщика сообщений не отображается (только черный экран), и я получаю MessageComposeResultCancelled в didFinishWithResult MFMessageComposeViewController.

Что генерирует это предупреждение «Предупреждение: попытка отклонить от контроллера представления, пока выполняется презентация или отклонить!»

Как правильно вызвать и показать составитель смс сообщений?

(это прекрасно работает, если я вызываю его напрямую, когда пользователь выбирает строку в списке с помощью didSelectRowAtIndexPath)

Вот код:

1- вызов первого UIActionSheet в методе didSelectRowAtIndexPath:

UIActionSheet *popupQuery;
...
[popupQuery showInView:self.view];

2- вызов второго UIActionSheet в методе clickedButtonAtIndex:

UIActionSheet *popupQuery2;
...
[popupQuery showInView:self.view];

3- из того же метода вызовите композитор сообщения:

[self sendSMS:@"" recipientList:[phoneNumbers objectAtIndex:buttonIndex]];

метод, который показывает композитор сообщений:

    (void)sendSMS:(NSString *)bodyOfMessage recipientList:(NSArray *)recipients
{
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = bodyOfMessage;
        controller.recipients = recipients;
        controller.messageComposeDelegate = self;

        [self presentModalViewController:controller animated:YES];
    }
}

person dzk    schedule 13.03.2013    source источник
comment
Можете ли вы опубликовать часть кода о том, как вы показываете/закрываете свои контроллеры представления? Как вы можете видеть из сообщения об ошибке, существует проблема с тем, как они представлены/закрыты.   -  person Petar    schedule 13.03.2013
comment
Это происходит на реальном iDevice или это только что было протестировано на симуляторе? canSendText Возвращает логическое значение, указывающее, может ли текущее устройство отправлять текстовые сообщения. Однако canSendText может возвращать значение true в Симуляторе, поскольку на вашем Mac может быть установлено приложение сообщений (см. дополнительный вопрос mby .me/Gw)   -  person Dan Clarke    schedule 13.03.2013
comment
тестирую на айфоне 5   -  person dzk    schedule 13.03.2013


Ответы (2)


решение найдено здесь: MFMessageComposeViewController показывает пустой/белый экран

    controller.recipients = [NSArray arrayWithObject:theRecipients];

theRecipients был массивом, содержащим только один элемент (выбранный номер телефона)

person dzk    schedule 18.03.2013

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

Следующий код показывает композитор, который не отменяется автоматически. Я вижу 0 в журнале, который является значением MessageComposeResultCancelled, только когда я нажимаю кнопку Cancel. Вы пытаетесь произвести взлом, нажав кнопку send автоматически?

композитор из списка действий делегата

MFMessageComposeViewController.h

enum MessageComposeResult {
    MessageComposeResultCancelled, //0
    MessageComposeResultSent,      //1
    MessageComposeResultFailed     //2
};

MyViewController.m

-(IBAction)onButtonPressed:(id)sender {
    UIActionSheet * sheet = [[UIActionSheet alloc] initWithTitle:@"Title"
                                                        delegate:self
                                               cancelButtonTitle:@"Go out"
                                          destructiveButtonTitle:@"Show message composer"
                                               otherButtonTitles:nil, nil];
    [sheet showInView:self.view];
}

-(void) actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if([MFMessageComposeViewController canSendText])
    {
        controller.body = @"body";
//        controller.recipients = recipients;
        controller.messageComposeDelegate = self;

        [self presentModalViewController:controller animated:YES];
    }
}

-(void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result {
    NSLog(@"%d", result);
    [controller dismissModalViewControllerAnimated:YES];
}
person A-Live    schedule 13.03.2013
comment
дело в том, что приложение получает MessageComposeResultCancelled сразу после вызова компоновщика сообщения - person dzk; 13.03.2013
comment
@dzk Это происходит, когда вы показываете композитора из actionSheet:didDismissWithButtonIndex:? - person A-Live; 13.03.2013
comment
да, вместо того, чтобы показывать компоновщика сообщений, он показывает пустой экран, подобный этому us/img594/7624/screenshot20130302at931.png - person dzk; 13.03.2013
comment
@dzk обновил ответ доказательством концепции. Пожалуйста, поделитесь своим методом делегирования. - person A-Live; 13.03.2013
comment
Я использую тот же код, что и A-Live. Нет, я не пытаюсь имитировать действие отправки. Просто показываю композитор сообщения. Иногда в логах у меня тоже такое сообщение: - init Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 Операция не может быть завершена. (Ошибка _UIViewServiceInterfaceErrorDomain 3.) - Истекло время ожидания контроллера удаленной компоновки (НЕТ)! - person dzk; 13.03.2013
comment
Я делаю это из UITableViewController. Если в этом же файле переместить код табличного представления didSelectRowAtIndexPath, то работает отлично - person dzk; 13.03.2013
comment
comment
@dzk Интересно, возможно, вы захотите сообщить об ошибке. - person A-Live; 18.03.2013