从呈现的视图控制器访问呈现视图控制器?

时间:2017-04-18 14:23:29

标签: swift uiviewcontroller swift3

我有一个视图控制器(包含我的菜单)显示在另一个视图控制器(我的应用程序)之上。

我需要从呈现的视图控制器(我的菜单)访问呈现视图控制器(在我的菜单下面),例如访问某些变量或使呈现视图控制器执行其中一个segue。

然而,我无法弄清楚该怎么做。 我知道“presentsViewController”和“presentsViewController”变量,但我没有设法成功使用它们。

任何想法?

代码(来自提供的VC,作为引用窗口的AppDelegate的引用):

if let presentingViewController = self.appDelegate.window?.rootViewController?.presentingViewController {
    presentingViewController.performSegue(withIdentifier: "nameOfMySegue", sender: self)
}

2 个答案:

答案 0 :(得分:5)

以下是使用委托设计模式与演示视图控制器进行对话。

首先声明一个协议,列出委托应该响应的所有变量和方法。

protocol SomeProtocol {

    var someVariable : String {get set}

    func doSomething()
}

下一步:使您的演示视图控制器符合协议。 将您的演示VC设置为代理

class MainVC: UIViewController, SomeProtocol {

    var someVariable: String = ""

    func doSomething() {
        // Implementation of do
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Your code goes here.

        if let destVC = segue.destination as? SubVC{
            destVC.delegate = self
        }
    }

}

最后,当您准备在演示VC(委托)上调用方法时。

class SubVC: UIViewController {
    var delegate : SomeProtocol?


    func whenSomeEventHappens() {

        // For eg : When a menu item is selected

        // Set some Variable
        delegate?.someVariable = "Some Value"

        // Call a method on the deleate
        delegate?.doSomething()
    }

}

答案 1 :(得分:4)

假设VCApplication正在呈现VCMenu,在VCMenu中您可以通过以下方式访问VCApplication:

git reset --hard 54a69ae
git merge -m "merging" f072912

您的示例weak let vcApplication = self.presentingViewController as? VCApplicationType 正在寻找显示self.appDelegate.window?.rootViewController?.presentingViewController的ViewController - 它将是rootViewController

修改TheAppMentor我已添加nil,因此没有保留周期。