UIViewController 的委托函数决定弹出

Posted

技术标签:

【中文标题】UIViewController 的委托函数决定弹出【英文标题】:UIViewController's delegate function which determines pop 【发布时间】:2018-05-14 12:34:03 【问题描述】:

我在导航堆栈中有 3 个 ViewController,它们是 ViewControllerA、ViewControllerB 和 ViewControllerC。

当我从 ViewControllerB 按下返回按钮时,我到达 ViewControllerA。

我想检查我是如何到达 ViewControllerA 的,无论是通过弹回还是作为导航堆栈的 rootViewController。

【问题讨论】:

添加您尝试过的代码。这个问题包含的信息要少得多,任何人都可以帮助你。 你想做什么请说明 【参考方案1】:

你可以给你的 backButton 一个 unwind 函数并在视图控制器中捕获它。

@IBAction func unwindToView(unwindSegue: UIStoryboardSegue) 
    if let XControllerView = unwindSegue.sourceViewController as? XController 
        print("Coming from XControllerView")
    
    else if let YControllerView = unwindSegue.sourceViewController as? YController 
        print("Coming from YControllerView")
    

有关放松的更多信息:https://developer.apple.com/documentation/uikit/uiviewcontroller/1621473-unwind

【讨论】:

【参考方案2】:

制定协议:

protocol DismissProtocol
func dismissPresentedViewControllerComplete()

我们会让 viewControllerA 符合这个协议。

在 ViewControllerB 中创建一个 DismissProtocol 类型的属性。

class ViewControllerB: UIViewController

var delegate: DismissProtocol?
//............


当您展示 ViewControllerB 时,将 ViewControllerA 指定为委托。

class SecondController: UIViewController
var delegate: DismissProtocol?

重写 ViewControllerA 中的协议方法:

extension ViewControllerA: DismissProtocol
func dismissPresentedViewControllerComplete() 
    // Do what you want to do when you return from ViewControllerB


现在,在 ViewControllerB 的关闭完成中,执行这个覆盖方法:

        self.dismiss(animated: false) 
        self.delegate?.dismissPresentedViewControllerComplete()
    

【讨论】:

以上是关于UIViewController 的委托函数决定弹出的主要内容,如果未能解决你的问题,请参考以下文章

当 UIViewController 回到顶部时,iOS 中是不是有委托函数来获得通知?

在 UIViewController 之外设置委托?

链接 uiviewcontroller 委托

将另一个 UIViewController 的视图放在“主”UIViewController 中——委托方法

从 appdelegate 设置 UIViewController 委托

UIView 需要推送一个 UIViewController(委托)