2008-11-11 72 views
6

我想绕过UIViews和UIViewControllers的角色。如果我以编程方式创建和插入子视图,通常是从视图还是控制器执行此操作?UIViewController与UIView - 哪一个应该创建子视图?

我真的只是想知道这是否有一个约定/模式。在我的示例应用程序中,我在运行时加载了50个图像,将它们添加为主视图的子视图,然后让用户将它们拖动到屏幕上。我目前做的视图的所有的initWithCoder初始化:

- (id)initWithCoder:(NSCoder*)coder 
{ 
    if (self = [super initWithCoder:coder]) { 
     // load UIImageViews and add them to the subview 
    } 

    return self; 
} 

的观点也实现的touchesBegan/touchesMoved允许拖动。当我尝试访问initWithCoder中的[self frame] .size时,我的问题就出现了,它似乎还没有被初始化。这让我觉得我可能会在错误的地方被加载图片...

+0

这取决于你与他们做什么...通常使用一个视图控制器,当你想带自转等全屏视图,或者当你要插入一个全屏视图有点像标签控制器。你能稍微扩展你的问题吗? – 2008-11-11 04:51:04

回答

7

这取决于你在做什么。如果视图表示“打包”的东西,那么您从视图本身创建子视图。如果你只是将视图聚合在一起,那么你应该从视图控制器来完成。

想想传统封装。您的子视图在概念上是其超级视图的“部分”,还是仅仅存在于绘图层次结构中?

+0

我用更多的信息更新了这个问题。就我而言,视图只是层次结构的一部分,但它也实现了touchesBegan/touchesMoved以允许拖动。 – 2008-11-11 05:05:19

2

假设你正在创建一个包含一些控件,比如编辑多个字段或东西记录的视图。由于您将在视图控制器中使用这些文本字段及其数据,因此它们在概念上属于视图控制器,并且父视图仅用于分组和布局目的。这可能是更常见的情况。

如果你正在创建一个视图子类表现得像一个新的控制,例如,那么我会说你应该创建和视图类中完全管理的意见。我想这种情况在实践中会少发生。

2

这听起来像你可能将它们添加到错误的地方。如果您将子视图添加到ViewController中,那么您可以在viewDidLoad上完成这项工作,并确保主视图已经初始化并准备好访问。

1

假人的解释是这样的:

每当你打算显示的视图,模式(presentModalViewController)

子类的UIViewController或内部的UINavigationController(pushViewController)

子类的UIView每当它是主视图中的小部件...比如你希望做的自定义按钮或...

更具体地在你的榜样......如果要初始化UIViewControllers可以设置视图的属性如。只有在您的视图添加到超级视图后才能使用框架大小。此时只有 UIViewController加载并初始化其视图。

我觉得你的情况,你应该使用UIViews ...你可以分配&初始化后立即设置帧大小。

相关问题