Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.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 如何以编程方式创建iOS应用程序视图_Iphone_Ios_Objective C_Uiview_Uiviewcontroller - Fatal编程技术网

Iphone 如何以编程方式创建iOS应用程序视图

Iphone 如何以编程方式创建iOS应用程序视图,iphone,ios,objective-c,uiview,uiviewcontroller,Iphone,Ios,Objective C,Uiview,Uiviewcontroller,我正在编写一个没有使用故事板/xib创建视图的应用程序,并且不确定放置视图设置代码的最佳位置。我尝试过几种不同的方法,但我不确定将视图设置代码与控制器代码分开的最佳方法 到目前为止,我尝试的方法有: 将所有我的视图设置代码(创建和定位按钮/标签)等放入控制器viewDidLoad方法中。我很确定这是一种糟糕的方式,因为你的控制器中有很多代码 - (void)viewDidLoad { [super viewDidLoad]; // other code here...

我正在编写一个没有使用故事板/xib创建视图的应用程序,并且不确定放置视图设置代码的最佳位置。我尝试过几种不同的方法,但我不确定将视图设置代码与控制器代码分开的最佳方法

到目前为止,我尝试的方法有:

  • 将所有我的视图设置代码(创建和定位按钮/标签)等放入控制器
    viewDidLoad
    方法中。我很确定这是一种糟糕的方式,因为你的控制器中有很多代码

  • - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // other code here...
        [self createView];
    }
    
  • 子类化
    UIView
    并在
    initWithFrame
    方法内设置接口元素。然后,我将此视图添加到视图控制器视图的顶部

    _customView = [[CustomView alloc] initWithFrame:self.view.frame];
    _customView.customLabel.text = @"Foo";
    [self.view addSubView:_customView]
    
  • 或者我将控制器视图指定为我的
    customView

    _customView = [[CustomView alloc] initWithFrame:self.view.frame];
    self.view = _customView;
    _customView.customLabel.text = @"Foo";
    

    在尽量避免这个问题过于主观的同时,是否有一个以编程方式创建iOS接口的最佳实践?这两种方法中的任何一种都是保持视图代码和控制器代码分离并可重用的好方法吗?

    如果只需要使用该视图一次,请将代码保留在
    viewdiload
    方法中。也许您可以在控制器中的特定方法中移动创建视图所需的代码

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // other code here...
        [self createView];
    }
    
    此外,如果您的视图是控制器的
    视图,您还可以考虑重写
    loadView
    方法并将代码放在那里。来自苹果医生

    可以替代此方法以手动创建视图。 如果选择这样做,请将视图层次结构的根视图指定给 视图属性

    如果您需要多次实例化视图,我将子类化a
    UIView
    ,并使用委托模式与控制器通信

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        // other code here...
        [self createView];
    }
    
    如果选择此方法,则需要重写
    layoutSubviews
    方法以在视图中排列子视图


    可以在中找到一个明确的例子。

    是否需要重用该代码?如果是,则可以为UIView子类化或创建类别扩展。在这种情况下,我更喜欢子类。是的,目标是使代码尽可能可重用和干净。我认为子类化工作得很好,我只是不确定使用子类视图的最佳方式。也许这两种方法都可以。好吧,我知道这是最简单的方法,但这不会导致您使用“胖”控制器,违反iOS应用程序使用的MVC设计模式吗?@AFraser否,您将
    UIView
    子类化,而不是
    UIViewController
    。它们是不同的东西。@AFraser IMHO,这种方法非常干净。您可以为视图创建子类。您与控制器通过delagate进行通信。你的评论是什么意思?很抱歉,我完全同意你的子类化方法。我指的是将所有视图设置代码保留在UIViewController类中。@AFraser在本例中,您可以利用类别扩展