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)
以下是使用委托设计模式与演示视图控制器进行对话.
首先声明一个协议,列出委托应该响应的所有变量和方法.
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)
假设 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因此没有保留周期。