在MFMessageComposeViewController被呈现然后被解除之后呈现视图不正确

时间:2012-03-16 19:14:05

标签: ios modalviewcontroller

我有一个显示表格视图的视图控制器。 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的调用有点hacky,但现在就足够了.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;
    }
}

问题是用户发送短信后表格视图单元格没有显示。

我想也许我需要刷新视图/表,所以我添加了从第二个VC到第一个VC的协议回调,当用户发送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 :(得分:0)

对于第二个变体,我改为:

[self presentViewController:controller animated:YES completion:nil];  [self dismissViewControllerAnimated:YES completion:nil];

这很有效,还没有尝试应用第一种方法。

答案 1 :(得分:0)

我遇到了类似的UI问题。 我的情况是:控制器,让我说控制器A,我编写了代码来呈现和解雇MFMessageComposeController,没有被直接用作活动控制器,而是我使用A.view作为另一个控制器的子视图,比如说控制器B.因此,写下以下内容会扭曲观点:

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

然后写下面的内容解决了我的问题:

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

customTabbarNavigation是控制器B,ans实际上是导航控制器,当控制器A的视图可见时它处于活动状态。

必须改变composeVC。