我有一个ViewController
,它提供了一个模态ViewController。从这个模态ViewController中我想呈现MailComposeViewController
。我的问题是解雇期间。我想同时解除两个显示的ViewController
。
我的前任抓住了presentingViewController
的一个实例,发送了一条消息来显示MailComposeViewController
,并在BaseViewController
中解除了模态ViewController。
[self dismissViewControllerAnimated:YES
completion:^{
[self presentViewController:mailViewController animated:YES completion:nil];
}];
我目前试图阻止这种情况,因为它是一个神级(超过5kloc),我需要把它拆开。
所以我尝试在我的模态ViewController中使用相同的模式,但使用self.presentingViewController
代替。这导致只是解雇模态ViewController,但没有显示任何内容。
在解雇之前抓住一个实例,但忽略了解雇的委托回调(难怪,因为模态ViewController不再显示)。
所以进入委托回调- (void) mailComposeController:(MFMailComposeViewController*) controller didFinishWithResult:(MFMailComposeResult) result error:(NSError*) error
我尝试在没有动画的情况下解除MailComposeViewController
之前的模态ViewController。这也删除了MailComposeViewController
(也不足为奇)。我可以首先解除MailComposeViewController
然后是模态ViewController,但这会创建一个不同的动画,其中控制器在不同的时间和顺序被解雇(我们都知道UX如何对这样的事情作出反应;))。
那么还有其他选项吗?我可以首先解除模态ViewController,然后显示MailComposeViewController
,而BaseViewController
中没有任何解雇代码?
谢谢:)
答案 0 :(得分:0)
呈现视图控制器负责解除它所呈现的视图控制器。如果在呈现的视图控制器本身上调用此方法,它会自动将消息转发给呈现视图控制器。
另一方面,呈现视图控制器当然负责呈现。因此,在BaseViewController
中没有任何解雇代码的情况下无法呈现新的视图控制器,在您的情况下,呈现视图控制器
你可以在没有动画的情况下解散然后呈现新的
[self dismissViewControllerAnimated:NO
completion:^{
[self presentViewController:mailViewController animated:YES completion:nil];
}];
答案 1 :(得分:0)
抓住presentingViewController
的实例并使用它似乎我错了。我只需要到处使用它。所以我最终使用此代码解除modal ViewController
并显示MailComposeViewController
:
self.presenter = self.presentingViewController;
[self dismissViewControllerAnimated:YES
completion:^{
[self.presenter presentViewController:mailViewController animated:YES completion:nil];
}];
在delegateMethod中解除MailComposeViewController
我呼叫:[self.presenter dismissViewControllerAnimated:YES completion:nil];
。