ios 呈现视图控制器也可以是呈现视图控制器吗?

xj3cbfub  于 2023-01-27  发布在  iOS
关注(0)|答案(5)|浏览(128)

在现有视图之上,我希望: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];

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

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

但是当我尝试使用presentViewController向用户显示另一个屏幕时,什么也没发生。我看不出为什么会这样,是不是有什么我不知道的事情?
实际上,SMS视图之前和之后的屏幕是相同的,除了它们有不同的文本,所以最简单的步骤序列将是:
a)向视图控制器呈现文本“abc”b)呈现SMS控制器c)当SMS被发送时解除SMS控制器d)使用IBOutlet更新第一视图控制器中的文本e)解除第一视图控制器。
但是正如前面提到的,如果我不关闭第一个视图控制器,SMS控制器就不会出现,所以我的主要问题是如何在第一个视图控制器上显示SMS控制器?

odopli94

odopli941#

您可以在一个关闭后显示另一个:

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];
xghobddn

xghobddn2#

我刚在iOS15上试过。是的,一个被介绍的VC可以介绍另一个VC。
假设您有:

VC1 --> present--> VC2

你可以很容易地在VC2上调用present(VC3(), animated: true, completion: nil),事情就会很好地工作。你可以很高兴地结束:

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

当你解除VC3时,它只会回到VC2,而不会回到VC1。

rqenqsqc

rqenqsqc3#

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

dba5bblo

dba5bblo4#

在我的例子中,我可以直接访问显示的视图控制器,因此在这种情况下:

self.present(viewControllerToPresent, animated: true) {
    //It's presented.
}
but5z9lq

but5z9lq5#

extension UIViewController{

    /// most top presented view controller
    var presentedTop:UIViewController {
        var ctrl:UIViewController = self;
        while let presented = ctrl.presentedViewController {
            ctrl = presented;
        }
        return ctrl;
    }
}
// call somewhere someCtrl.presentedTop.present(vc, animated:true)

相关问题