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

时间:2015-08-17 23:09:22

标签: ios loadview

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

这是关于以编程方式严格开发应用程序。我看到在类-init方法中已经分配了这些视图/ init的一些情况,但是在其他时候我看到-loadview方法中设置了其他视图。

任何人都可以提供一些清晰度吗?也许是一些抽象的例子,说明何时为这两种方法做最好的时间。

由于

2 个答案:

答案 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/

和这个

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10-SW36

答案 1 :(得分:-1)

-init*系列函数是初始化简单属性的好地方,例如字符串,数字等。初始化程序在分配了对象的内存之后运行,如果你有可以在那里初始化的东西,那么你应该在那里进行。

对于UIViewController实例,您可能必须等到nib已加载,然后才能初始化其他所有内容。如果您有需要放置在子视图中的图像,或者需要配置的字体,或者其他什么,那么您需要首先加载nib。 -viewDidLoad是最适合这种情况的地方。

对于UIView实例(或UITableViewCell之类的子类),您还需要等待加载nib。在这种情况下,您可以使用-awakeFromNib