我很好奇,分配/ init的最佳选择在哪里,设置视图的属性(uibutton,uilabel,uitextfield,初始化变量等)。
这是关于以编程方式严格开发应用程序。我看到在类-init方法中已经分配了这些视图/ init的一些情况,但是在其他时候我看到-loadview方法中设置了其他视图。
任何人都可以提供一些清晰度吗?也许是一些抽象的例子,说明何时为这两种方法做最好的时间。
由于
答案 0 :(得分:-1)
以下是对此的快速评论:
-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中进行设置,有时你在加载视图中进行设置,这取决于你想要做什么,但这就是你如何以纯粹的程序化方式设置它,分离职责,封装,并且所有工作都被分成了一个类,所有的控制器都控制着一个类。
http://matthewmorey.com/creating-uiviews-programmatically-with-auto-layout/
和这个
答案 1 :(得分:-1)
-init*
系列函数是初始化简单属性的好地方,例如字符串,数字等。初始化程序在分配了对象的内存之后运行,如果你有可以在那里初始化的东西,那么你应该在那里进行。
对于UIViewController实例,您可能必须等到nib已加载,然后才能初始化其他所有内容。如果您有需要放置在子视图中的图像,或者需要配置的字体,或者其他什么,那么您需要首先加载nib。 -viewDidLoad
是最适合这种情况的地方。
对于UIView实例(或UITableViewCell之类的子类),您还需要等待加载nib。在这种情况下,您可以使用-awakeFromNib
。