我有一个视图控制器(包含我的菜单)显示在另一个视图控制器(我的应用程序)之上。
我需要从呈现的视图控制器(我的菜单)访问呈现视图控制器(在我的菜单下面),例如访问某些变量或使呈现视图控制器执行其中一个segue。
然而,我无法弄清楚该怎么做。 我知道“presentsViewController”和“presentsViewController”变量,但我没有设法成功使用它们。
任何想法?
代码(来自提供的VC,作为引用窗口的AppDelegate的引用):
if let presentingViewController = self.appDelegate.window?.rootViewController?.presentingViewController {
presentingViewController.performSegue(withIdentifier: "nameOfMySegue", sender: self)
}
答案 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
,因此没有保留周期。