2

我在多个地方读过一次UIViewController只能在屏幕上显示一个。但我不太明白如何完成我所需要的。

想象一下天气应用程序。有一个带有滚动视图的视图控制器,其中添加了多个视图(天气面板)。想必这些都是由 main 添加和管理的,mainUIViewController也负责滚动等。

但是想象一下,这些天气面板中的每一个都是一个CarView,每个都有关于特定类型汽车的数据,以及一些用于编辑该数据的控件。

拥有一系列CarViewControllers,每个都有Car他们可以操纵的属性不是很有意义吗?每个CarViewController都负责它的汽车数据对象,它的视图,并将它们粘合在一起,主视图控制器只负责将每个添加carViewController.view到它的滚动视图中。

这对于可重用性和封装性不是更好吗?更不用说方便了。

4

2 回答 2

1

我认为这取决于它是否会让你的生活更轻松。我喜欢做的另一种选择是编写UIView专门用于显示“概念”模型(如汽车)的复合子类,然后在它们上编写类别以使用特定模型实现填充视图信息。这样,您可以在更改模型时重新使用视图,但仍然可以防止某些逻辑使视图控制器混乱。我尝试为使用 aUISegmentedControl或其他东西切换的完全不同的视图保留一个视图控制器。

UIView编辑: a及其填充类别的示例。

@interface CarView : UIView

@property (strong) UILabel *modelLabel;
@property (strong) UILabel *makeLabel;
@property (strong) UILabel *yearLabel;
//etc

@end

然后你有一个特定于模型的类别,虽然视图上的类别确实更适合控制器层;虽然有点违反 MVC,但我认为从职责分配的角度来看它工作得很好,不会将您的主视图实现与任何数据实现耦合,并使您的视图控制器更精简,所以我认为值得权衡。

@interface CarView (CarEntityPopulating)

- (void)populateFieldsWithEntity:(NSManagedObject *)entity;

@end

@implementation CarView (CarEntityPopulating)

- (void)populateFieldsWithEntity:(NSManagedObject *)entity
{
    self.modelLabel.text = [entity valueForKey:@"name"];
    self.makeLabel.text = [[entity valueForKey:@"make"] valueForKey:@"name"];
    self.yearLabel.text = [[entity valueForKey:@"year"] stringValue];
    //etc....
}
于 2012-10-01T21:28:35.860 回答
0

似乎现在使用容器视图控制器在 iOS 5 中明确支持这一点。

目前还没有很多资源可以讨论它,但是这个 WWDC 会议很有用。

这个问题也提供了一些资源。

于 2012-10-06T18:02:45.627 回答