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



我很好奇,在哪里是分配/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

相关内容

  • 没有找到相关文章

最新更新