我已经多次阅读,一次只能在屏幕上显示一个UIViewController
。但我不太明白如何完成我需要的东西。
想象一下天气应用程序。有一个带有滚动视图的视图控制器,添加了多个视图(天气面板)。据推测,这些都是由主UIViewController
添加和管理的,它还负责滚动等。
但是想象一下,这些天气面板中的每一个都是CarView
,每个都有关于特定类型汽车的数据,以及一些用于编辑该数据的控件。
拥有一系列CarViewControllers
是否有意义,每个Car
属性都可以操作CarViewController
属性?每个carViewController.view
将负责它的汽车数据对象,它的视图,并将它们粘合在一起,主视图控制器将负责将每个{{1}}添加到其滚动视图。
对于可重用性和封装,这不是更好吗?更不用说更方便了。
答案 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)