我需要创建一个类控制器来管理我创建的自定义视图的行为 . 标准方法是子类UIViewController,但在我的情况下,我决定子类化NSObject主要有三个原因:
-
我的视图需要添加为主视图控制器的小子视图(它不会使用像presentModalViewController或pushViewController这样的东西显示...)并且它不需要任何类型的工具栏或导航控件
-
很可能我的控制器不需要通知设备方向,因为它的视图将始终以纵向格式使用,所以我没有兴趣接收通常的旋转消息willRotateToInterfaceOrientation等...
-
我需要保持这个类尽可能轻量级,以尽量减少内存消耗 . 没有子类化UIViewController有利于获得更轻的类而没有一堆我永远不需要使用的方法
我的控制器的界面非常简单,例如:
@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];
我想知道你对我的选择有什么看法,如果你认为它有可能存在缺陷,当你需要为像我这样不全屏的视图编写控制器时,你通常会做什么 .
谢谢
4 回答
是的,这是正确的方法 .
UIViewControllers专门用于控制全屏视图,而不是用于控制子屏幕 . 在iOS5中,有一种以这种方式组合子屏幕视图控制器的机制,但是在没有大量hackery的情况下iOS4中没有这种机制 .
在视图和控制器本身耦合的情况下,您还可以考虑创建一个自定义视图子类,它是自己的控制器,因此,例如,您可以拥有一个自包含的表视图子类来管理自己的数据,并且可以将其放入页面 .
我认为这是一个可接受的解决方案 .
另一个解决方案是创建一个“胖”视图来控制它自己(例如,MKMapView,UITextView等) . 这可能会使事情变得更易于管理,并且如果视图非常专业,并且其控制器仅用于这一类视图,那么您实际上不会失去任何可重用性(因为没有太多) .
您的视图未全屏显示并不重要 . 有可能(并且通常)具有由子视图组成的视图,每个子视图都有自己的控制器 .
子类化UIViewController不会消耗不合理的内存量,因此这不应该是考虑因素的一部分 .
使用您的解决方案,您将失去灵您可能会在需要响应UILifecyle-Messages或使用其他UIViewController功能的上下文中重用您的解决方案 .
如果您的视图应该是轻量级的,您可以考虑使用UIView子类并使用委托来查看视图背后的逻辑 .
您好,你是NSObject的子类,并在其中声明一个UIView
我建议您应该继承UIView,因此您不必声明其他视图对象 .
所以代替
self.view
你可以简单地称为self