在 -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 中初始化视图(按钮、标签等)的主要内容,如果未能解决你的问题,请参考以下文章