Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.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
建议采用什么方法来考虑iOS UI初始化?_Ios_Objective C_Ios7_Uikit - Fatal编程技术网

建议采用什么方法来考虑iOS UI初始化?

建议采用什么方法来考虑iOS UI初始化?,ios,objective-c,ios7,uikit,Ios,Objective C,Ios7,Uikit,在iOS视图控制器中,我通常有如下代码: -(void)viewDidLoad { UIScrollView*scrollView=[[UIScrollView alloc]init]; //[配置视图的几行代码] [self.view addSubview:scrollView] } 这会变得混乱,因此我添加了一个助手方法(例如,createScrollView)来alloc、init和配置视图。这是建筑视图的既定模式吗?是否有命名辅助对象方法的约定?我注意到的一点是,由于ARC,不允许使用

在iOS视图控制器中,我通常有如下代码:

-(void)viewDidLoad
{
UIScrollView*scrollView=[[UIScrollView alloc]init];
//[配置视图的几行代码]
[self.view addSubview:scrollView]
}

这会变得混乱,因此我添加了一个助手方法(例如,
createScrollView
)来alloc、init和配置视图。这是建筑视图的既定模式吗?是否有命名辅助对象方法的约定?我注意到的一点是,由于ARC,不允许使用名称
initScrollView

以下是我遵循的模式:

init
/
initWithFrame:
中创建您的对象,并设置在此控制器生命周期内不会更改的任何属性:

- (instancetype) init {
    self = [super init];

    if (self) {
        _textField = [UITextField new];
        _textField.keyboardType = UIKeyboardTypeEmailAddress;
    }

    return self;
}
如果您想将这些方法分离为
createTextFields
等方法,这很好,不过如果您可以在一个地方看到所有实例化的内容的列表,那么调试就更容易了

viewDidLoad
中,设置视图层次结构:

- (void) viewDidLoad {
    [self.view addSubview:self.textField];
}
视图willlayoutsubviews
中,设置帧(如果未使用自动布局):


此方法将使您能够成功处理视图大小调整和旋转事件。

构建视图的一种常见模式是使用interface builder。我认为它不适合您的需要,对吗?最佳实践是在情节提要上尽可能多地设置UI,而在代码中尽可能少地设置UI,因为正如您所说:杂乱无章。但是,当我确实需要进行一些UI设置时,我会按照您的建议,使用
createScrollView
这样的方法来完成我需要做的一切,只需从
viewDidLoad
或其他有意义的地方调用该方法。我以编程方式构建视图主要是为了学习和超越界面生成器提供的功能。您仍然可以在界面生成器中执行大量操作,然后在代码中进行调整。在interface builder中旋转五分钟可以节省几行代码,并使代码更具可读性。在-init中初始化子视图与在-loadView中初始化相比是否有优势?
- (void) viewWillLayoutSubviews {
    self.textField.frame = CGRectMake(10, 44, 320, 50);
}