子视图UIViewController或在视图不是全屏时创建自定义NSObject

时间:2012-01-19 11:03:12

标签: iphone ios uiviewcontroller controller nsobject

我需要创建一个类控制器来管理我创建的自定义视图的行为。 标准方法是子类UIViewController,但在我的情况下,我决定 NSObject的子类主要有三个原因:

  • 我的视图需要添加为主视图控制器的小子视图(它不会使用像presentModalViewController或pushViewController ......这样显示)并且它不需要任何类型的工具栏或导航控件 LI>
  • 很可能我的控制器不需要通知设备方向,因为它的视图将始终以纵向格式使用,所以我没有兴趣接收通常的旋转消息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 个答案:

答案 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];