【问题标题】:Initializing Views(button, label, etc) in -init or -loadview在 -init 或 -loadview 中初始化视图(按钮、标签等)
【发布时间】:2015-08-17 23:09:22
【问题描述】:

我很好奇,分配/初始化、设置视图属性(uibutton、uilabel、uitextfield、初始化变量等)的最佳选择在哪里。

这是关于严格以编程方式开发应用程序的。我看到一些情况下,这些视图已在类 -init 方法中分配/初始化,但其他时候我看到其他视图在 -loadview 方法中设置。

任何人都可以对此提供一些说明吗?也许还有一些抽象的例子,说明什么时候对这两种方法都是最好的。

谢谢

【问题讨论】:

    标签: ios loadview


    【解决方案1】:

    -init* 系列函数将是初始化简单属性的好地方,例如字符串、数字等。初始化程序在对象的内存分配后立即运行,如果您有可以在那里初始化的东西,那么您应该在那里进行。

    对于 UIViewController 实例,您可能必须等到 nib 加载完毕才能初始化其他所有内容。如果您有需要放置在子视图中的图像,或者需要配置的字体,或者其他任何东西,那么您需要首先加载 nib。 -viewDidLoad 是存放这些东西的最佳地点。

    对于 UIView 实例(或 UITableViewCell 之类的子类),您也需要等待 nib 被加载。在这种情况下,您可以使用-awakeFromNib

    【讨论】:

    • 他说的是程序化的,不是用笔尖
    • 没有笔尖,笔尖是为那些不知道如何编程的人准备的,谢谢​​,他要求一个抽象的例子,不是吗?如果您有任何其他问题,请随时在此处阅读:developer.apple.com/library/ios/documentation/UserExperience/…
    • 哦,是的,我差点忘了告诉你为什么我对你投了反对票,请阅读上面的 cmets 和我的答案下面的 cmets。谢谢
    【解决方案2】:

    以下是对此的快速评论:

    -SubClass 一个 UIView,将你所有的 UI 元素粉碎到那个视图中,至少尽可能多的。将此子类视图的标题导入视图控制器的实现文件

    -在您的视图控制器中,像这样对视图控制器的视图进行类型转换:

    -(HHYSignUpViewFirstPhase*)contentView
    {
        return (id)[self view];
    }
    

    -调用loadView方法

    -(void)loadView
    {
        [self setView:[HHYSignUpViewFirstPhase new]];
    }
    

    -在您的 viewdidLoad 中,您现在可以通过调用“[self contentView]”来从子类 UIView 中为按钮等设置处理程序,如下所示:

      -(void)viewDidLoad
        {
            [super viewDidLoad];
            [self setTitles:@"Sign Up"];
            [[[self contentView] nameField] setDelegate:self];
            [[[self contentView] emailField] setDelegate:self];
            [[[self contentView] passwordField] setDelegate:self];
            [[[self contentView] signupButton] addTarget:self action:@selector(signupPressed) forControlEvents:UIControlEventTouchUpInside];
        }
    

    现在你已经设置好了,你只需要添加方法来处理来自按钮的事件,例如在视图中确实从你子类化的子视图中加载:

    -(void)signupPressed
    {
       ///do work
    }
    

    UIVIew 子类:

    HHYSignUpViewFirstPhase.h

    @interface HHYSignUpViewFirstPhase : UIView
    
    @property (nonatomic) UIButton * signupButton;
    @property (nonatomic) UITextField * emailField;
    @property (nonatomic) UITextField * nameField;
    @property (nonatomic) UITextField * passwordField;
    
    @end
    

    HHYSignUpViewFirstPhase.m

    #import "HHYSignUpViewFirstPhase.h"
    
    @implementation HHYSignUpViewFirstPhase
    
    -(id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self == nil)
            return nil;
    
    
              //do work, set up buttons, constraints, etc, etc.
    
    
             return self;
    }
    @end
    

    本质上,我在这里要说的是,在子类 UIView 中,您可以初始化 UIView 并设置其所有约束和所有内容,包括帧,然后在 UIViewController 的加载视图方法中,然后调用此视图并输入 UIViewController 的视图。因此,有时您在 init 中进行设置,有时您在加载视图中进行设置,这取决于您要执行的操作,但这就是您以纯程序化方式进行设置的方式,具有职责分离、封装,并在 MVC 框架中捆绑在一起——所有工作都被分成类,所有控制器都控制一个类。

    http://matthewmorey.com/creating-uiviews-programmatically-with-auto-layout/

    还有这个

    https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10-SW36

    【讨论】:

    • 这如何回答这个问题?
    • 它向他展示了如何以编程方式进行设置,您阅读问题了吗?
    • 为了强化我的意思,请看我答案底部的链接
    • 什么时候可以在 -init 方法而不是 -loadview 中以编程方式创建视图?例如按钮或标签。我已经看到它完成了,只是不确定它是否有充分的理由,或者它是否只是糟糕的代码。
    • 大声笑,你在开玩笑吧?这就是你编写 UIView 子类的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多