2

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

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

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

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

我试图想象这种可能性

在此处输入图像描述

4

3 回答 3

2

是的。这正是childViewControllers它的用途。AnyUIViewController可以充当宿主来查看它直接控制的视图和由其他UIViewController实例控制的视图。

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

于 2013-08-29T17:29:39.543 回答
1

这只是在这里被问到:iOS - Using multiple view controllers for a single screen

在 iOS5+ 中添加了 API 来解决这个问题。在 iOS5 之前,使用 viewController 来管理其他 viewController 是很笨拙的。

看一下 UIViewController 的实例方法-addChildViewController

于 2013-08-29T17:31:19.440 回答
1

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

几乎您将 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,它是一种非常流行的设计模式,称为“观察者”,非常有用,您可以使用委托来处理类似的解决方案。

于 2013-08-29T17:32:51.603 回答