我很好奇,分配/初始化、设置视图属性(uibutton、uilabel、uitextfield、初始化变量等)的最佳选择在哪里。
这是关于严格以编程方式开发应用程序的。我看到某些情况下,这些视图已在类 -init 方法中分配/初始化,但其他时候我看到在 -loadview 方法中设置了其他视图。
任何人都可以对此提供一些说明吗?或许还有一些抽象的例子,说明什么时候对这两种方法都是最好的。
谢谢
以下是对此的快速评论:
-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/
和这个
函数族将-init*
是初始化简单属性(例如字符串、数字等)的好地方。初始化程序在分配对象的内存后立即运行,如果您有可以在那里初始化的东西,那么您应该在那里进行。
对于 UIViewController 实例,您可能必须等到 nib 加载完毕才能初始化其他所有内容。如果您有需要放置在子视图中的图像,或者需要配置的字体,或者其他任何东西,那么您需要首先加载 nib。 -viewDidLoad
是最好的地方。
对于 UIView 实例(或 UITableViewCell 之类的子类),您也需要等待 nib 被加载。你可以-awakeFromNib
在这种情况下使用。