簡體   English   中英

將數據傳遞給ViewController

[英]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如下所示:

在此處輸入圖片說明

簡而言之,我有一個ViewControllerAView加載了兩個附加ViewController- ViewControllerBViewControllerC

如您所見,我試圖通過將ViewController彼此分離來遵循MVC方法。

我面臨的問題是我想將數據從MyViewControllerA傳遞到MyViewControllerBMyViewControllerC

我想到的第一件事是在MyViewControllerAView創建一個屬性,例如被調用的test 因此,在viewWillLoadviewDidLoad我可以像這樣傳遞內容:

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傳遞到MyViewControllerBMyViewControllerC任何想法,而不會破壞MVC模式或引入不良做法?

我相信您應該以以下方式解決該問題。

thirdPartyUIComponent(_:)方法從MyViewControllerAView移到MyViewControllerA我認為MVC中的視圖實例化和處理視圖控制器是不合適的。 現在, MyViewControllerA視圖控制器將負責視圖控制器BC

然后,由於我希望您需要在MyViewControllerAView訪問BC的視圖,因此將它們直接傳遞給MyViewControllerAView但是,僅傳遞BC的視圖,而不傳遞視圖控制器本身。

這樣, A視圖控制器將管理視圖控制器BC ,但MyViewControllerAView仍將有權訪問B.viewC.view以正確布置它們。

PS:如果用戶在MyViewControllerAView上觸發了某些UI操作時,如果應調用thirdPartyUIComponent(_:)回調,請使用委托模式將該事件傳遞給MyViewControllerA進行干凈處理。

UView不應創建UIViewControllers並自行管理它們。 ViewControllerA負責管理ViewControllerBViewControllerC 做到這一點的好方法是使BC成為A的子視圖控制器。您可以通過委托與父視圖控制器A進行通信。 蘋果教程如何做到這一點: https : //developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

但是@Milan解決方案也可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM