将数据传递给ViewController

时间:2017-10-10 11:17:56

标签: ios iphone swift model-view-controller uiviewcontroller

我正在努力解决以下问题:

我有一个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看起来像:

enter image description here

简而言之,我有一个ViewControllerA View加载了两个额外的ViewControllers - 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清洁。

如何在不破坏MVC模式或引入不良做法的情况下将数据从MyViewControllerA传递到MyViewControllerBMyViewControllerC的任何想法?

2 个答案:

答案 0 :(得分:2)

我相信你应该以下列方式解决问题。

thirdPartyUIComponent(_:)方法从MyViewControllerAView移到MyViewControllerA - 我认为它不适合MVC中的视图来实例化和处理视图控制器。现在,MyViewControllerA视图控制器将负责视图控制器BC

然后,由于我希望您需要访问BCMyViewControllerAView的观看次数,然后将其直接传递给MyViewControllerAView - 但是,仅传递BC的观看次数,而不是观看控制者本身。

这样A视图控制器将管理视图控制器BC,但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解决方案也可以。