首页 文章

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

提问于
浏览
4

我需要创建一个类控制器来管理我创建的自定义视图的行为 . 标准方法是子类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 回答

  • 0

    是的,这是正确的方法 .

    UIViewControllers专门用于控制全屏视图,而不是用于控制子屏幕 . 在iOS5中,有一种以这种方式组合子屏幕视图控制器的机制,但是在没有大量hackery的情况下iOS4中没有这种机制 .

    在视图和控制器本身耦合的情况下,您还可以考虑创建一个自定义视图子类,它是自己的控制器,因此,例如,您可以拥有一个自包含的表视图子类来管理自己的数据,并且可以将其放入页面 .

  • 1

    我认为这是一个可接受的解决方案 .

    另一个解决方案是创建一个“胖”视图来控制它自己(例如,MKMapView,UITextView等) . 这可能会使事情变得更易于管理,并且如果视图非常专业,并且其控制器仅用于这一类视图,那么您实际上不会失去任何可重用性(因为没有太多) .

  • 1

    当你需要为像我一样不是全屏的视图编写控制器时,你通常会做什么?

    您的视图未全屏显示并不重要 . 有可能(并且通常)具有由子视图组成的视图,每个子视图都有自己的控制器 .

    我需要保持这个类尽可能轻量级,以尽量减少内存消耗 . 没有子类化UIViewController有利于获得更轻的类而没有一堆我永远不需要使用的方法

    子类化UIViewController不会消耗不合理的内存量,因此这不应该是考虑因素的一部分 .

    [...]如果您认为它可能存在缺陷[...]

    使用您的解决方案,您将失去灵您可能会在需要响应UILifecyle-Messages或使用其他UIViewController功能的上下文中重用您的解决方案 .

    如果您的视图应该是轻量级的,您可以考虑使用UIView子类并使用委托来查看视图背后的逻辑 .

  • 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];
    

相关问题