我尝试创建一个小扩展程序,以便从详细信息视图控制器访问主视图控制器以更新变量。
import UIKit
extension UISplitViewController {
var ggida_primaryViewController: UIViewController? {
get {
let navController = self.viewControllers.first! as? UINavigationController
return navController.topViewController!
}
}
}
我使用以下代码调用它:
let masterVC: MasterViewController? = self.splitViewController?.ggida_primaryViewController as! MasterViewController?
但是得到以下错误:
Could not cast value of type 'UINavigationController' (0x10e2c2008) to 'xxx.MasterViewController' (0x10b980350).
请注意,这是在Master-Detail项目中,因为它的导航控制器导致了这个问题。
由于
答案 0 :(得分:2)
其中一些将取决于您如何配置故事板以与导航控制器和实际的主控制器和详细控制器进行交互。 Apple建议here“安装不会改变的主视图和辅助视图控制器。常见的技术是在[Master和Detail]位置安装导航控制器,然后根据需要推送和弹出新内容。”
在Xcode 8.2中使用全新的Master-Detail应用程序(遵循该模式),此扩展适用于我:
extension UISplitViewController {
var primaryViewController: MasterViewController? {
let navController = self.viewControllers.first as? UINavigationController
return navController?.topViewController as? MasterViewController
}
}
以下是我在DetailViewController中的viewDidLoad()
中调用它的方法:
let masterViewController = splitViewController?.primaryViewController
print(masterViewController?.objects)
在这种情况下,每次DetailViewController加载时,MasterViewController上的属性var objects = [Any]()
都会正确打印出来。