美文网首页iOS基础篇
iOS开发中的present与dismiss控制器UIViewC

iOS开发中的present与dismiss控制器UIViewC

作者: 麦子_KB | 来源:发表于2019-06-16 14:15 被阅读0次

    我们都知道iOS开发中有两种常用的进入与销毁控制器方法,一种是存在导航栏的情况,另外一种就是今天我探究的模态进入与推出控制器。

    一. 两个属性presentingViewController与presentedViewController
    presentingViewController 代表推出当前控制器的控制器;
    presentedViewController 代表当前控制器推出的控制器;
    我们可以举例说明:A -> B -> C,假设B为当前控制器,那么A即为B的presentingViewController,C即为B的presentedViewController。

    二. 控制器销毁的方法及顺序
    还是刚才的例子,A -> B -> C,当我们在B控制器中调用方法

    self.dismiss(animated: true, completion: nil)
    

    会出现什么样的效果呢?答案是C控制器将会被销毁。所以在上面的例子中,想要实现只销毁C控制器,有三种方式可以选择:

    B控制器中调用 
    self.dismiss(animated: true, completion: nil)
    
    同样是在B控制器中调用
    self.presentedViewController?.dismiss(animated: true, completion: nil)
    
    在C控制器中调用
    self.dismiss(animated: true, completion: nil)
    

    那么,除了以上提到的这些方式,还有其他方式可以选择么?答案当然是有的,我们可以使用一直间接的方式,通过去销毁B控制器来连带销毁C控制器。还是我们刚才的例子:A -> B -> C,假设我们当前在C控制器,触发某一事件时,我希望实现效果,B和C控制器一起销毁,只保留显示A控制器,要想实现这个效果,可以使用最简洁明了的两种方式:回调和通知。相信有一定开发经验的同学可以轻松写出这种不同实现方式的代码,这里就只简单讲一下通知的方式:

    C控制器中发出通知
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "dismiss"), object: nil, userInfo: nil)
    
    若在A控制器中接收通知
    NotificationCenter.default.addObserver(self, selector: #selector(dismissVC), name: NSNotification.Name(rawValue: "dismiss"), object: nil)
    @objc private func dismissVC() {
            self.dismiss(animated: true, completion: nil)
    }
    
    若在B控制器中接收通知
    NotificationCenter.default.addObserver(self, selector: #selector(dismissVC), name: NSNotification.Name(rawValue: "dismiss"), object: nil)
    @objc private func dismissVC() {
            self.presentingViewController?.dismiss(animated: true, completion: nil)
    }
    上述两种方式都可以实现相同的效果
    

    三. 调用dismiss需要注意的点
    根据我们刚才的例子,细心的同学可以发现,当我们在C控制器调用

    self.dismiss(animated: true, completion: nil)
    

    只会销毁当前控制器C;若是在B控制器中调用该方法,那么B控制器不会被销毁,只会销毁C控制器,这是我们日常开发需求注意的细节事项。

    希望本文可以帮助到广大iOS开发者,如有不足之处,欢迎各位及时指导,相互进步!

    附上Demo

    相关文章

      网友评论

        本文标题:iOS开发中的present与dismiss控制器UIViewC

        本文链接:https://www.haomeiwen.com/subject/lhtgfctx.html