10

在现有视图之上,我想:a)向用户显示一个屏幕 b)然后发送 SMS c)向用户显示另一个屏幕。

对于 a) 我正在这样做:

[[UIApplication sharedApplication].delegate.window.rootViewController presentViewController: firstController animated: NO completion:nil];

对于 b) 我正在做同样的事情,除了这当然是呈现一个不同的 vc,一个 MFMessageComposeViewController。

但是,为了使 b) 出现,我首先必须使用以下方法关闭第一个视图控制器:

   [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:NO completion: nil];

到目前为止,我可以看到第一个视图出现,然后看到 SMS 撰写视图出现。发送短信时,我这样做是为了关闭短信撰写视图

   [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:NO completion: nil];

但是,当我尝试使用 presentViewController 向用户展示另一个屏幕时,什么也没有发生。我看不出这应该是什么原因,有什么我不知道的吗?

实际上 SMS 视图之前和之后的屏幕是相同的,只是它们有不同的文本,所以最简单的步骤顺序是:

a) 显示带有文本“abc”的视图控制器 b) 显示 SMS 控制器 c) 发送 SMS 时关闭 SMS 控制器 d) 使用 IBOutlet 更新第一个视图控制器中的文本 e) 关闭第一个视图控制器。

但是如前所述,如果我不关闭第一个视图控制器,SMS 控制器将不会出现。所以我的主要问题是如何在第一个视图控制器之上呈现 SMS 控制器?

4

4 回答 4

12

您可以在另一个关闭后呈现一个:

UIViewController *rvc = [UIApplication sharedApplication].delegate.window.rootViewController;
[rvc dismissViewControllerAnimated:NO completion:^{
    [rvc presentViewController: secondController animated: NO completion:nil];
}];

或者在顶部展示另一个:

UIViewController *rvc = [UIApplication sharedApplication].delegate.window.rootViewController;
UIViewController *pvc = rvc.presentedViewController;  // you may need to loop through presentedViewControllers if you have more than one
[pvc presentViewController: secondController animated: NO completion:nil];
于 2013-01-12T15:50:29.623 回答
1

我刚刚在iOS15上试过。是的,一个展示的 VC 可以展示另一个 VC。

所以假设你有:

VC1 --> present--> VC2

你可以很容易地调用present(VC3(), animated: true, completion: nil)VC2 并且一切正常。你可以愉快地结束:

VC1 --> present--> VC2 --present--> VC3

FWIW 当你关闭 VC3 时,它只会回到 VC2。它不会回到VC1。

于 2022-02-02T02:14:51.983 回答
0

iOS 不允许您同时打开两个模态视图。模态视图被设计为最顶层的视图。

于 2012-04-23T21:12:37.847 回答
0

就我而言,我可以直接访问呈现的视图控制器,因此在这种情况下:

self.present(viewControllerToPresent, animated: true) {
    //It's presented.
}
于 2018-04-23T05:54:32.627 回答