我试图围绕UIViews和UIViewControllers的角色。如果我以编程方式创建和插入子视图,通常是从视图还是控制器执行此操作?
我真的只是想知道是否有这样的约定/模式。在我的示例应用程序中,我在运行时加载了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 :(得分:7)
这取决于你在做什么。如果视图表示“已打包”的内容,则您可以从视图本身创建子视图。如果您只是将视图聚合在一起,那么您应该从视图控制器中进行聚合。
考虑传统的封装。您的子视图在概念上是其超级视图的“部分”,还是仅仅存在于绘图层次结构中?
答案 1 :(得分:2)
假设您正在创建一个包含一些控件的视图,比如编辑包含多个字段或其他内容的记录。由于您将在视图控制器中使用这些文本字段及其数据,因此它们在概念上“属于”视图控制器,并且父视图仅用于分组和布局目的。这可能是更常见的情况。
例如,如果您创建的视图子类的行为类似于新控件,那么我会说您应该在视图类中完全创建和管理视图。我想这种情况在实践中不会那么频繁发生。
答案 2 :(得分:2)
听起来你可能会把它们添加到错误的地方。如果您将子视图添加到ViewController中,那么您可以在viewDidLoad上执行此操作,并且您可以保证主视图已经初始化并准备好访问。
答案 3 :(得分:1)
虚拟解释如下:
当您计划将视图显示为模态(presentModalViewController)或UINavigationController(pushViewController)内部时,子类UIViewController
子类UIView只要它是主视图中的一个小组件...例如你想做自定义按钮或...
更具体地说,在您的示例中...如果您正在初始化UIViewControllers,您可以设置视图的属性,例如。仅在将视图添加到superview后才能使用框架大小。只要 在那一点上,UIViewController加载并初始化它的视图。
我认为在你的情况下你应该使用UIViews ...你可以在分配和初始化后立即设置帧大小。