MFMailComposeViewController打破了navigationController的行为

时间:2010-12-01 08:04:43

标签: iphone objective-c sdk

好的情况是这样的:我有一个带有导航控制器(NC)的主ViewController(mainVC)和两个子ViewControllers(childVC1-childVC2)。

在mainVC上调用viewWillAppear时,NC的导航栏会被隐藏:
    - (void) viewWillAppear:(BOOL)animated {
     [self.navigationController setNavigationBarHidden:TRUE animated:animated]; }

在通过NC在mainVC上推送任何子视图之前显示导航栏:
    mainVC *childVC1 = [[childVController1 alloc] initWithNibName:@"childVController1" bundle:nil];
    [self.navigationController setNavigationBarHidden:FALSE animated:TRUE];
    [self.navigationController pushViewController:childVC1 animated:YES];
    [childVC1 release];

当通过导航栏上的标准“后退”按钮弹出任何子视图后,通过mainVC的viewWillAppear再次隐藏导航栏。

所有工作都顺利进行,直到MFMailComposeViewController,标准邮件viewController通过来自任何子viewController的presentModalViewController方法调用:
    - (void) sendMail {
     MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
     picker.mailComposeDelegate = self;
     [picker setSubject:[NSString stringWithFormat:@"Subject"];
     NSString emailBody=[NSString stringWithFormat:@"Mail Message Body"]];
     [picker setMessageBody:emailBody isHTML:NO];
     [picker setToRecipients:[NSArray arrayWithObject:@"john.appleseed@apple.com"]];
     if (picker != nil) {
     [self presentModalViewController:picker animated:YES];
     [picker release];
    } else {
     NSLog(@"No email configured");
     }
    }
    - (void)mailComposeController:(MFMailComposeViewController
)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
     [self dismissModalViewControllerAnimated:YES];
    }

现在邮件viewController被解雇(发送邮件),我们在子viewController上。

此时,如果我们点击导航栏上的“返回”按钮以返回主VC,则导航栏不会被隐藏。因为mainVC上的viewWillAppear方法没有被调用。

我尝试通过在子视图中引入导航控制器的委托来实现解决方法,从而在发送邮件视图控制器(已发送邮件)之后隐藏NavBar并弹出子视图。

似乎可以做到这一点,但是如果我立即推送任何子视图(电子邮件childVC1或其他相当平坦的childVC2),然后通过上面的操作将其弹出,则执行上述操作(发送邮件,隐藏NavBar和弹出子视图)后退按钮,导航栏不会再次隐藏!因为mainVC上的viewWillAppear方法仍未被调用。不会调用childVC上的viewWillDisappear

我得出结论,通过从任何子viewController通过presentModalViewController方法调用邮件viewController,我以某种方式打破了navigationController的导航机制。

请注意,mainVC显示在TabBarItem中。如果我转到另一个选项卡并返回到此选项卡,则会恢复navigationController的行为 - 直到我发送另一个邮件。

必须有一些我做得不好的事情。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试将隐藏代码放入viewDidAppear而不是viewWillAppear?