0

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

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

任何人都可以对此提供一些说明吗?或许还有一些抽象的例子,说明什么时候对这两种方法都是最好的。

谢谢

4

2 回答 2

-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 中进行设置,有时您在加载视图中进行设置,这取决于您要执行的操作,但这就是您以纯程序化方式进行设置的方式,具有职责分离、封装, 并在 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

于 2015-08-17T23:16:32.403 回答
-1

函数族将-init*是初始化简单属性(例如字符串、数字等)的好地方。初始化程序在分配对象的内存后立即运行,如果您有可以在那里初始化的东西,那么您应该在那里进行。

对于 UIViewController 实例,您可能必须等到 nib 加载完毕才能初始化其他所有内容。如果您有需要放置在子视图中的图像,或者需要配置的字体,或者其他任何东西,那么您需要首先加载 nib。 -viewDidLoad是最好的地方。

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

于 2015-08-17T23:17:08.050 回答