将数据传递到视图控制器

问题描述:

我有以下问题挣扎:将数据传递到视图控制器

我有一个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的样子:

enter image description here

简而言之,我有一个ViewControllerA,其View加载两个额外的ViewControllers - ViewControllerBViewControllerC

正如您所看到的,我试图通过将ViewController彼此分开来遵循MVC方法。

我面临的问题是,我想通过数据从MyViewControllerAMyViewControllerBMyViewControllerC

我想到的第一件事是在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模式或引入不良做法的任何想法?

+1

这就是MVC中的“M”部分来自于 - 模型;每个视图控制器应该可以访问相同的模型。 – Paulw11

我相信你应该以下列方式处理问题。

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

然后,因为我希望你需要访问的BC的意见在MyViewControllerAView,直接将它们传递到MyViewControllerAView - 然而,仅传递意见BC,而不是视图控制器本身。

这样的A视图控制器将管理视图控制器BC,但MyViewControllerAView仍然有机会获得B.viewC.view给他们适当布局。

P.S:如果当某些UI动作是由用户在MyViewControllerAView触发thirdPartyUIComponent(_:)回调应该叫,然后使用委托模式该事件传递给MyViewControllerA干净地处理它。

UView不应创建UIViewControllers和管理它们自身。让ViewControllerA负责管理ViewControllerBViewControllerC。很好的做法是让BC A的子视图控制器。您可以通过委托与父视图控制器A进行通信。 苹果教程如何做到这一点: https://developer.apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

但是@Milan解决方案也没关系。