在 -init 或 -loadview 中初始化视图(按钮、标签等)

Posted

技术标签:

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

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

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

以上是关于在 -init 或 -loadview 中初始化视图(按钮、标签等)的主要内容,如果未能解决你的问题,请参考以下文章

初视敏捷

乐视电视刷机卡在进度条

柏视医疗招聘WebGL开发工程师

教程6- 视图集和路由器

Android真机测试乐视手机启用开发者模式

无996无内卷,乐视过上了“神仙日子”?