解雇呈现模式ViewController

时间:2015-06-25 14:16:37

标签: ios objective-c uiviewcontroller

我有一个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中没有任何解雇代码?

谢谢:)

2 个答案:

答案 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];