Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 构建视图层次结构的最佳实践_Iphone_Ios_Objective C - Fatal编程技术网

Iphone 构建视图层次结构的最佳实践

Iphone 构建视图层次结构的最佳实践,iphone,ios,objective-c,Iphone,Ios,Objective C,从其他堆栈溢出问题中,我了解到,在视图控制器中,可以使用viewDidLoad方法初始化子视图,使用viewWillLayoutSubviews方法设置帧。这意味着我们需要保留视图控制器实例中所有视图的引用(如下所示)。这一切都很好,处理设备旋转等 UILabel* myLabel; - (void)viewDidLoad { myLabel = [[UILabel alloc] init]; [myLabel setText:@"Hello"]; } - (void)vie

从其他堆栈溢出问题中,我了解到,在视图控制器中,可以使用viewDidLoad方法初始化子视图,使用viewWillLayoutSubviews方法设置帧。这意味着我们需要保留视图控制器实例中所有视图的引用(如下所示)。这一切都很好,处理设备旋转等

UILabel* myLabel;

- (void)viewDidLoad
{
    myLabel = [[UILabel alloc] init];
    [myLabel setText:@"Hello"];
}

- (void)viewWillLayoutSubviews
{
    [myLabel setFrame:CGRectMake(0, 0, self.view.frame.size.width, 21)];
}
我的问题是,如果子视图的层次结构很复杂,该怎么办。例如,如果您有一个子视图,它是一个UIView,并且您将子视图添加到该UIView中(并且可能会更深入),该怎么办。是否必须保留对整个视图层次结构中每个视图的引用,以便在视图WillLayoutSubViews上修改每个视图的框架?这似乎是唯一的办法。约束是不是最好的方法,这样您就不必经常修改框架?构建大量自定义UIView以使管理此层次结构在每个自定义视图中更易于管理和自包含,这是最好的答案吗


希望这是一个足够清楚的问题。请提前感谢。

无论何时操作视图或子视图,都必须调用

[view layoutSubviews];
这将使用新的特性设置重新生成约束。加载viewController时,可以设置不处理框架或边界的所有属性,然后在viewWillLayoutSubviews中设置视图的框架,这样可以设置所有约束并确保满足这些约束

您放在情节提要中要使用的任何对象都应该具有一个属性,该属性将保存对该对象的引用。这是一个很好的编码实践,特别是如果您遵循测试驱动开发的规则

现在,为了回答您的问题,如果您在故事板中创建了复杂的层次结构,那么只要约束条件良好,一切都应该很好。如果您是在代码中创建的,请确保在调用addSubview时调用LayoutSubView 例如:

UIView* view1 = [[UIView alloc] initWithFrame:CGRectZero];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectZero];
[view1 addSubview:view2];
[view1 layoutSubviews];
更多视图并不能使结构变得更好,但是如果您有100个子视图。。。让我们成为现实吧。。需要在单独的视图中对某些内容进行分类

使用约束可以完美地定义视图框架。起初您可能没有注意到这些差异,但如果将其与自动调整大小掩码进行比较,您将看到这些差异。此外,这里有一个指南,明确地向您展示了不同之处


如果您希望划分一些逻辑并重用组件,那么使用子视图控制器也是值得考虑的。

如果您的逻辑那么复杂,为什么不使用.xib文件来为您完成所有这些工作呢?我只使用了IB并以编程方式完成了一些事情,所以我没有手动处理.xib文件。仅供参考,我所说的视图是从服务器动态获取的,可能有1个或100个视图,它们看起来可能都有点不同。谢谢你的回答。我正在代码中创建这些子视图(也许我应该在故事板中创建它们,不确定)。所以你是在暗示,如果我在没有故事板的情况下管理它,我需要对层次结构中的每个视图进行引用?给它们添加标签将有助于使代码更具描述性,我有时甚至会创建一个全新的UIView子类来处理一个场景的不同部分,但这是情境性的,最后,如果你的代码易于阅读且不复杂,那么你做得很好。保留每个子视图的子视图…及其所有子视图的引用似乎有点多(递归)。你不必做每个视图,我经常跳过仅用于存储对象的视图,但与此同时,我有一个滚动视图,其中有一个内容视图,然后有5个视图,所有这些视图都有引用,以及它们的大多数子视图,如果不需要使用代码进行操作,那么不用担心iTunes的使用,故事板会去掉所有的代码,但是标签文本之类的数据,我个人认为你应该使用故事板,作为一种视觉表现,你也可以看到它在哪里。。。有时我打错了号码,我觉得我在写。。。但这在文本中不会像在宽度/高度/起源不正确的故事板中那样明显