我有一个包含基本视图的UIViewController。视图应根据模型而有所不同,例如根据图书模型中的类型加载不同的子视图。
如果图书模型可以是Paperback或Magazine类型,那么如果当前对象属于Magazine类型,则当前视图应显示订阅框子视图。
订阅框子视图包含需要控制器的各种UIKit元素(例如UITextfield,UITableView),订阅框应仅向主控制器报告抽象和简化的结果(这样主控制器不需要直接控制UITextField和UITableView),目标操作的示例可以是didRequestSubscription:(SubscriptionRequest *)subscription
,SubscriptionRequest
包含其卡片详细信息和订阅周期取自UITextField上的输入和UITableView中的选定行。
我认为控制器可以添加一个本身有控制器的子视图吗?这会违反MVC设计模式吗?
我试图想象出这个
的可能性
答案 0 :(得分:2)
是。这正是childViewControllers
的用途。任何UIViewController
都可以作为主机来直接查看由其他UIViewController
个实例控制的控件和视图。
从MVC的角度来看,我们的想法是将数据与控件与显示器分开。如果控制和显示被分成多个部分,那就是(希望是好的)划分。
答案 1 :(得分:1)
这只是在这里问的:iOS - Using several view controllers for a single screen
在iOS5 + API中添加了解决此问题的方法。在iOS5之前,使用viewController来管理其他viewControllers是很困难的。
查看-addChildViewController
答案 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”非常有用,你可以使用代理工作类似的解决方案。