屏幕上同时有多个UIViewControllers

时间:2012-10-01 21:18:00

标签: ios cocoa-touch uiviewcontroller

我已经多次阅读,一次只能在屏幕上显示一个UIViewController。但我不太明白如何完成我需要的东西。

想象一下天气应用程序。有一个带有滚动视图的视图控制器,添加了多个视图(天气面板)。据推测,这些都是由主UIViewController添加和管理的,它还负责滚动等。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

@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....
}

答案 1 :(得分:0)

现在看来这在iOS 5中使用容器视图控制器显式支持。

目前还没有很多资源可以讨论它,但this WWDC session很有用。

This question也提供了一些资源。