将数据传递到视图控制器
我有以下问题挣扎:将数据传递到视图控制器
我有一个ViewController
和与它相连的单独UIView
我用的不是故事板或XIB /笔尖,这意味着我把“图纸视图编程”做法。
class MyViewControllerA: UIViewController {
override func loadView() {
self.view = MyViewControllerAView()
}
}
上面的作品都很好。
然后在我的MyViewControllerAView
我使用,其利用委托加载MyViewControllerA
内的两个UIViewControllers
第三方UI组件:
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
加载两个额外的ViewControllers - 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约定,因为View不再仅仅是UI。所以我想避免这种情况,并保持MVC清洁。
关于如何将数据从MyViewControllerA
传递到MyViewControllerB
和MyViewControllerC
而不打破MVC模式或引入不良做法的任何想法?
我相信你应该以下列方式处理问题。
将thirdPartyUIComponent(_:)
方法从MyViewControllerAView
移出MyViewControllerA
- 我认为MVC中的视图不适合实例化和处理视图控制器。现在视图控制器将负责视图控制器B
和C
。
然后,因为我希望你需要访问的B
和C
的意见在MyViewControllerAView
,直接将它们传递到MyViewControllerAView
- 然而,仅传递意见B
和C
,而不是视图控制器本身。
这样的A
视图控制器将管理视图控制器B
和C
,但MyViewControllerAView
仍然有机会获得B.view
和C.view
给他们适当布局。
P.S:如果当某些UI动作是由用户在MyViewControllerAView
触发thirdPartyUIComponent(_:)
回调应该叫,然后使用委托模式该事件传递给MyViewControllerA
干净地处理它。
UView不应创建UIViewControllers和管理它们自身。让ViewControllerA负责管理ViewControllerB和ViewControllerC。很好的做法是让B和C A的子视图控制器。您可以通过委托与父视图控制器A进行通信。 苹果教程如何做到这一点: https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
但是@Milan解决方案也没关系。
这就是MVC中的“M”部分来自于 - 模型;每个视图控制器应该可以访问相同的模型。 – Paulw11