【发布时间】:2018-03-21 18:47:30
【问题描述】:
我正在努力解决以下问题:
我有一个ViewController 和一个单独的UIView 附加到它上面,而不是故事板或xib/nib,这意味着我采用了“以编程方式绘制视图”的方法。
class MyViewControllerA: UIViewController {
override func loadView() {
self.view = MyViewControllerAView()
}
}
以上工作一切正常。
然后在我的MyViewControllerAView 中,我正在使用第三方 UI 组件,它通过使用委托在MyViewControllerA 中加载两个UIViewControllers:
class MachineHomeView: UIView, ThirdPartyUIComponentDelegate {
//code ...
func thirdPartyUIComponent(_ thirdPartyUIComponent: ThirdPartyUIComponent, viewControllerAt index: UInt) -> UIViewController {
switch index {
case 0:
return MyViewControllerC()
case 1:
return MyViewControllerC()
//..more code
}
}
}
UI 看起来像:
简而言之,我有一个ViewControllerA,它的View 加载了两个额外的视图控制器——ViewControllerB 和ViewControllerC
如您所见,我试图通过将 View 和 Controller 彼此分开来遵循 MVC 方法。
问题我面临的问题是我想将数据从MyViewControllerA 传递到MyViewControllerB 和MyViewControllerC。
我首先想到的是在MyViewControllerAView 中创建一个属性,例如称为test。所以在viewWillLoad 或viewDidLoad 我可以传递一些东西给它,比如:
self.view.test = "some data"
然后在我可以做的两个附加视图控制器实例化的委托中:
func thirdPartyUIComponent(_ thirdPartyUIComponent: ThirdPartyUIComponent, viewControllerAt index: UInt) -> UIViewController {
switch index {
case 0:
let myViewControllerB = MyViewControllerB()
myViewControllerB.someProperty = self.test
return myViewControllerB
case 1:
let myViewControllerC = MyViewControllerC()
myViewControllerC.someProperty = self.test
return myViewControllerC
}
}
}
在我看来,采用上述方式违反了 MVC 约定,因为视图不再只负责 UI。因此我想避免这种情况并保持 MVC 干净。
关于如何在不破坏 MVC 模式或引入不良做法的情况下将数据从 MyViewControllerA 传递到 MyViewControllerB 和 MyViewControllerC 有任何想法吗?
【问题讨论】:
-
这就是MVC中“M”部分的用武之地——模型;每个视图控制器都应该可以访问相同的模型。
标签: ios iphone swift model-view-controller uiviewcontroller