[英]Passing data to ViewController
我正在努力解決以下問題:
我有一個ViewController
並附加了一個單獨的UIView
,代替了Storyboard或xib / nib,這意味着我采用了“以編程方式繪制視圖”的方法。
class MyViewControllerA: UIViewController {
override func loadView() {
self.view = MyViewControllerAView()
}
}
以上工作正常。
然后在MyViewControllerAView
我使用第三方UI組件,該第三方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
加載了兩個附加ViewController- 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中的視圖實例化和處理視圖控制器是不合適的。 現在, MyViewControllerA
視圖控制器將負責視圖控制器B
和C
然后,由於我希望您需要在MyViewControllerAView
訪問B
和C
的視圖,因此將它們直接傳遞給MyViewControllerAView
但是,僅傳遞B
和C
的視圖,而不傳遞視圖控制器本身。
這樣, A
視圖控制器將管理視圖控制器B
和C
,但MyViewControllerAView
仍將有權訪問B.view
和C.view
以正確布置它們。
PS:如果用戶在MyViewControllerAView
上觸發了某些UI操作時,如果應調用thirdPartyUIComponent(_:)
回調,請使用委托模式將該事件傳遞給MyViewControllerA
進行干凈處理。
UView不應創建UIViewControllers並自行管理它們。 讓ViewControllerA負責管理ViewControllerB和ViewControllerC 。 做到這一點的好方法是使B和C成為A的子視圖控制器。您可以通過委托與父視圖控制器A進行通信。 蘋果教程如何做到這一點: https : //developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html
但是@Milan解決方案也可以。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.