我正在努力解决以下问题:
我有一个ViewController
和一个单独的UIView
,我使用它而不是storyboard或xib / nib,这意味着我以编程方式绘制了#34;方法
class MyViewControllerA: UIViewController {
override func loadView() {
self.view = MyViewControllerAView()
}
}
以上工作都很好。
然后在我的MyViewControllerAView
内我使用第三方UI组件,通过使用委托在UIViewControllers
内加载两个MyViewControllerA
:
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清洁。
如何在不破坏MVC模式或引入不良做法的情况下将数据从MyViewControllerA
传递到MyViewControllerB
和MyViewControllerC
的任何想法?
答案 0 :(得分:2)
我相信你应该以下列方式解决问题。
将thirdPartyUIComponent(_:)
方法从MyViewControllerAView
移到MyViewControllerA
- 我认为它不适合MVC中的视图来实例化和处理视图控制器。现在,MyViewControllerA
视图控制器将负责视图控制器B
和C
。
然后,由于我希望您需要访问B
中C
和MyViewControllerAView
的观看次数,然后将其直接传递给MyViewControllerAView
- 但是,仅传递B
和C
的观看次数,而不是观看控制者本身。
这样A
视图控制器将管理视图控制器B
和C
,但MyViewControllerAView
仍然可以访问B.view
和{{ 1}}将它们正确地放置。
PS:如果用户在C.view
上触发某些UI操作时应调用thirdPartyUIComponent(_:)
回调,则使用委托模式将该事件传递给MyViewControllerAView
干净利落地处理它。
答案 1 :(得分:1)
UView不应该创建UIViewControllers并自己管理它们。让 ViewControllerA 负责管理 ViewControllerB 和 ViewControllerC 。这样做的好方法是使A的 B 和 C 子视图控制器。您可以通过委托与父视图控制器 A 进行通信。 Apple教程如何制作: https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
然而@Milan解决方案也可以。