MVC设计模式 - 控制器可以有多个具有自己的控制器的视图吗?

时间:2013-08-29 17:25:10

标签: ios model-view-controller

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

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

订阅框子视图包含需要控制器的各种UIKit元素(例如UITextfield,UITableView),订阅框应仅向主控制器报告抽象和简化的结果(这样主控制器不需要直接控制UITextField和UITableView),目标操作的示例可以是didRequestSubscription:(SubscriptionRequest *)subscriptionSubscriptionRequest包含其卡片详细信息和订阅周期取自UITextField上的输入和UITableView中的选定行。

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

我试图想象出这个

的可能性

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

在iOS5 + API中添加了解决此问题的方法。在iOS5之前,使用viewController来管理其他viewControllers是很困难的。

查看-addChildViewController

的UIViewController实例方法

答案 2 :(得分:1)

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

你会将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它是一个非常流行的设计模式调用“Observer”非常有用,你可以使用代理工作类似的解决方案。