我很好奇,在哪里是分配/init,设置视图属性(uibutton, uilabel, uitextfield,初始化变量等)的最佳选择。
这是关于严格编程开发应用程序。我看到一些情况下,这些视图已经分配/init类-init方法,但其他时候我看到其他视图设置在-loadview方法。
有谁能解释清楚吗?也许还有一些抽象的例子,说明什么时候使用这两种方法的最佳时机是。
谢谢
-init*
系列函数将是初始化简单属性的好地方,例如字符串,数字等。初始化器在为对象分配内存之后运行,如果你有东西可以在那里初始化,那么你应该在那里进行初始化。
对于UIViewController实例,你可能需要等到nib被加载之后才能初始化其他的东西。如果你有需要放在子视图中的图像,或者需要配置的字体,等等,那么你需要先加载nib。-viewDidLoad
是放这些东西的最好地方。
对于UIView实例(或子类如UITableViewCell),你需要等待nib也被加载。在这种情况下可以使用-awakeFromNib
对此有一个简短的评论:
-子类化一个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];
}
现在你已经设置好了,你只需要添加方法来处理来自按钮的事件,例如在视图didload from你子类化的子视图:
-(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的load view方法中,你然后调用这个视图并typcast UIViewController的视图。所以,有时你在init中进行设置,有时你在load视图中进行设置,这取决于你想要做什么,但这就是你如何以一种纯编程的方式设置它,具有职责分离,封装,所有这些都在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