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

vbu*_*zze 2 uiviewcontroller swift swift3

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

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

但是,我只是想不通怎么做.我知道"presentsViewController"和"presentsViewController"变量,但我没有设法成功使用它们.

任何的想法 ?

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

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

The*_*tor 6

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

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

protocol SomeProtocol {

    var someVariable : String {get set}

    func doSomething()
}
Run Code Online (Sandbox Code Playgroud)

下一步:使您的演示视图控制器符合协议.将您的演示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
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,当您准备在呈现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()
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 协议模式的简单解释。干杯。 (2认同)

dmo*_*row 5

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

weak let vcApplication = self.presentingViewController as? VCApplicationType
Run Code Online (Sandbox Code Playgroud)

您的示例self.appDelegate.window?.rootViewController?.presentingViewController正在寻找呈现的 ViewController rootViewController- 它将是nil.

根据我添加的TheAppMentor 进行编辑,weak因此没有保留周期。