Представление представления не отображается должным образом после того, как MFMessageComposeViewController представлен и затем отклонен - PullRequest
0 голосов
/ 16 марта 2012

У меня есть View Controller, который отображает табличное представление.VC вызывает другого VC для отображения представления отправки SMS пользователю, код для этого SMS VC:

- (void) sendSMSWithBody: (NSString*) body andRecipients: (NSArray*) recipients
{
    MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
    if ([MFMessageComposeViewController canSendText])
    {
        controller.messageComposeDelegate = self;
        controller.body = body;
        controller.recipients = recipients;
        [[UIApplication sharedApplication].delegate.window.rootViewController addChildViewController:self];
        [self presentModalViewController:controller animated:YES];
    }
}

- (void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
    [self dismissModalViewControllerAnimated:YES];
    [[UIApplication sharedApplication].delegate.window.rootViewController removeFromParentViewController];    
}

(я знаю, что вызов sharedApplication немного хакерский, но пока его будет достаточно. rootViewController - это UINavigationController, в котором его корневой контроллер настроен на контроллер табличного представления)

Я вызываю VC SMS из таблицы VC следующим образом:

- (void ) viewDidAppear:(BOOL)animated
{
    static BOOL presentedSMSVC = NO;
    if (!presentedSMSVC)
    {
        SendSMSController *sendSMS = [[SendSMSController alloc] init];
        [sendSMS sendSMSWithBody:@"body" 
                   andRecipients:[NSArray arrayWithObject:@"123456789"]];
        presentedRegisterVC = YES;
    }
}

Проблема заключается в том, чтопосле того, как пользователь отправил SMS, ячейки табличного представления не отображаются.

Я подумал, может быть, мне нужно обновить представление / таблицу, поэтому я добавил обратный вызов протокола из второго виртуального канала в первый, который вызывается, когда пользовательотправляет SMS, а затем в рамках обратного вызова [self.tableView reloadData] Но это не имеет значения.

Итак, я избавился от промежуточного класса и отредактировал табличное представление так, чтобы оно отображало представление SMS следующим образом:

- (void ) viewDidAppear:(BOOL)animated
   {
    static BOOL presentedRegisterVC = NO;
    if (!presentedRegisterVC)
    {
        MFMessageComposeViewController *controller = [[MFMessageComposeViewController alloc] init];
        if ([MFMessageComposeViewController canSendText])
        {
            controller.messageComposeDelegate = self;
            controller.body = @"body";
            controller.recipients = [NSArray arrayWithObject:@"12345678"];
            [self presentModalViewController:controller animated:NO];
        }
    }
}


- (void) messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{
    [self dismissModalViewControllerAnimated:NO];    
}

Но теперь MFMessageComposeViewController не закрывается (хотя messageComposeViewController: didFinishWithResult): вызывается)

В чем проблема с обоими подходами?Спасибо

Ответы [ 2 ]

0 голосов
/ 14 ноября 2016

Я столкнулся с похожей проблемой пользовательского интерфейса. Мой случай был следующим: контроллер, скажем, контроллер A, в котором я написал код для представления и отклонения MFMessageComposeController, не использовался непосредственно в качестве активного контроллера, скорее, я использовал A.view как подпредставление для другого контроллера, скажем контроллер B. Таким образом, написание следующего искажает представление:

[self presentViewController:composeVC animated:YES completion:nil];

Но тогда написать следующее решило мою проблему:

[self.customTabbarNavigation presentViewController:composeVC animated:YES completion:nil];

customTabbarNavigation, был контроллером B, а фактически был навигационным контроллером, который был активен, когда вид контроллера A был виден.

То же самое изменение должно было быть сделано для увольнения composeVC.

0 голосов
/ 17 марта 2012

Для второго варианта я изменил на:

[self presentViewController: контроллер анимирован: ДА завершение: ноль]; [self dismissViewControllerAnimated: YES завершение: nil];

И это сработало, не пытались применить к первому способу.

...