【问题标题】:MVC Design Pattern - Can a Controller have multiple views which have their own controller?MVC 设计模式 - 控制器可以有多个视图,它们有自己的控制器吗?
【发布时间】:2013-09-02 06:19:51
【问题描述】:

我有一个包含基本视图的 UIViewController。视图应该因模型而异,例如根据书籍模型的类型加载不同的子视图。

如果 Book Model 可以是 Paperback 或 Magazine 类型,那么如果当前对象是 Magazine 类型,则当前视图应该显示订阅框子视图。

订阅框子视图包含各种需要控制器的 UIKit 元素(例如 UITextfield、UITableView),订阅框应该只向主控制器报告一个抽象和简化的结果(这样主控制器不需要直接控制 UITextField 和 UITableView),target-action 的示例可以是didRequestSubscription:(SubscriptionRequest *)subscription,其中SubscriptionRequest 包含他们的卡片详细信息和订阅期,取自 UITextField 上的输入和 UITableView 中的选定行。

我认为控制器可以添加本身具有控制器的子视图是否正确?这会违反 MVC 设计模式吗?

我试图想象这种可能性

【问题讨论】:

    标签: ios model-view-controller


    【解决方案1】:

    是的。这正是childViewControllers 的用途。任何UIViewController 都可以作为宿主来查看它直接控制的视图和由其他UIViewController 实例控制的视图。

    从 MVC 的角度来看,其思想是将数据与控件与显示分开。如果控件和显示被分成多个部分,那就是(希望是好的)划分。

    【讨论】:

      【解决方案2】:

      这只是在这里问的:iOS - Using several view controllers for a single screen

      在 iOS5+ 中添加了 API 来解决这个问题。在 iOS5 之前,使用 viewController 来管理其他 viewController 很不方便。

      看看-addChildViewController的UIViewController实例方法

      【讨论】:

        【解决方案3】:

        你可以这样做,它是完全有效的。但是您可能希望将控制器添加为观察者。 “阅读观察者设计模式”。

        几乎你会为 viewController 订阅视图,并且 viewController 会收到你视图中发生的事件的通知。您将从视图推送通知,并从任何必须了解该事件的 viewController 观察它。

        例如,您的视图控制器将订阅如下:

        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
        [notificationCenter addObserver:self selector:@selector(infoReceived:) name:@"data saved" object:nil];
        

        您的视图将按如下方式推送事件:

        NSNotification *registerNotification = [NSNotification notificationWithName:@"data saved" object:self userInfo:registerInfo];
        NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
        [notificationCenter postNotification:registerNotification];
        

        请注意,通知的名称是“数据已保存”,然后我可以为给定视图中发生的事件注册尽可能多的视图控制器。

        我希望这会有所帮助,并且它不会破坏 MVC,它是一种非常流行的设计模式,称为“观察者”非常有用,您可以使用委托来处理类似的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-29
          • 1970-01-01
          • 2016-09-21
          • 2012-02-12
          • 1970-01-01
          • 2017-02-23
          相关资源
          最近更新 更多