【问题标题】:Passing data to ViewController将数据传递给 ViewController
【发布时间】:2018-03-21 18:47:30
【问题描述】:

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

我有一个ViewController 和一个单独的UIView 附加到它上面,而不是故事板或xib/nib,这意味着我采用了“以编程方式绘制视图”的方法。

class MyViewControllerA: UIViewController {
override func loadView() { 
        self.view = MyViewControllerAView()
    }
}

以上工作一切正常。

然后在我的MyViewControllerAView 中,我正在使用第三方 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 加载了两个额外的视图控制器——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 约定,因为视图不再只负责 UI。因此我想避免这种情况并保持 MVC 干净。

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

【问题讨论】:

  • 这就是MVC中“M”部分的用武之地——模型;每个视图控制器都应该可以访问相同的模型。

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


【解决方案1】:

我认为您应该按照以下方式解决问题。

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

然后,由于我希望您需要访问 MyViewControllerAView 中的 BC 的视图,请将它们直接传递给 MyViewControllerAView - 但是,仅传递 B 和 @987654332 的视图@,而不是视图控制器本身。

这样A 视图控制器将管理视图控制器BC,但MyViewControllerAView 仍然可以访问B.viewC.view 以正确布局它们。

PS:如果当用户在MyViewControllerAView 上触发某些 UI 操作时应该调用 thirdPartyUIComponent(_:) 回调,则使用委托模式将该事件传递给 MyViewControllerA 以干净地处理它。

【讨论】:

    【解决方案2】:

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

    不过@Milan 的解决方案也可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多