我需要创建一个类控制器来管理我创建的自定义视图的行为。 标准方法是子类UIViewController,但在我的情况下,我决定 NSObject的子类主要有三个原因:
我的控制器的界面非常简单,例如:
@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { }
/**
* The view is created internally by the controller and the client class
* can access to it in readonly mode
*/
@property (nonatomic, readonly) UIView *view;
/**
* A Property to change the view appearance
*/
@property (nonatomic, assign) MyScrollTabBarViewState viewState;
/**
* Others properties used to construct the view's subviews
*/
@property (nonatomic, retain) Location *rootLocation;
@property (nonatomic, readonly, retain) Place *place;
/**
* Designated initializer
*/
- (id)initWithPlace:(Place *)aPlace;
- (void)setRootLocation:(Location *)location animated:(BOOL)animated;
@end
要从父视图控制器显示其内部视图,我将使用以下内容:
tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace];
tabBarController.viewState = MyScrollTabBarViewStateXX;
tabBarController.view.frame = CGRectMake(...);
[self.view addSubview:tabBarController.view];
我想知道你对我的选择有什么看法,如果你认为它可能存在缺陷,当你需要为像我这样不全屏的视图编写控制器时,你通常会做些什么。
由于
答案 0 :(得分:1)
我认为这是一个可以接受的解决方案。
另一种解决方案是创建一个“胖”视图来控制它自己(例如,MKMapView,UITextView等)。这可能会使事情变得更易于管理,如果视图非常专业,并且其控制器只能用于这一类视图,那么您实际上并没有失去任何可重用性(因为没有太多)。 / p>
答案 1 :(得分:1)
是的,这是正确的方法。
UIViewControllers专门用于控制全屏视图,而不是用于控制子屏幕。在iOS5中,有一种以这种方式组合子屏幕视图控制器的机制,但是在没有大量hackery的情况下iOS4中没有这种机制。
在视图和控制器本身耦合的情况下,您还可以考虑创建一个自己的控制器的自定义视图子类,例如,您可以拥有一个自包含的表视图子类来管理自己的数据,并且可以只是被放入页面。
答案 2 :(得分:0)
当你需要为像我一样不是全屏的视图编写控制器时,你通常会做什么
您的视图未全屏显示并不重要。有可能(并且通常)具有由子视图组成的视图,每个子视图都有自己的控制器。
我需要保持这个类尽可能轻量级,以尽量减少内存消耗。没有子类化UIViewController有利于获得更轻的类而没有一堆我永远不需要使用的方法
子类化UIViewController不会消耗不合理的内存量,因此这不应该是考虑因素的一部分。
[...]如果你认为它可能存在缺陷[...]
使用您的解决方案,您会失去灵活性。您可能会在需要响应UILifecyle-Messages或使用其他UIViewController功能的上下文中重用您的解决方案。
如果您的视图应该是轻量级的,您可以考虑使用UIView子类并使用委托来查看视图背后的逻辑。
答案 3 :(得分:0)
您好,您正在继承NSObject并在其中声明一个UIView
@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { }
@property (nonatomic, readonly) UIView *view;
我建议你应该将UIView子类化,这样你就不必声明一个额外的视图对象了。
因此,您可以简单地引用self.view
self
tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace];
tabBarController.viewState = MyScrollTabBarViewStateXX;
tabBarController.frame = CGRectMake(...);
[self.view addSubview:tabBarController];