使用init相关数据自定义UIViewController init

时间:2014-06-28 14:21:08

标签: ios objective-c uiview uiviewcontroller

我对init专门针对自定义UIViewControllers方法提出了疑问。假设我写了一个init方法,该方法接受一个参数(假设UIViewControllerInitMode),该参数负责指示视图应加载的方式。因此,当调用viewDidLoad时,将检查该参数(现在存储为类变量),并相应地加载GUI相关内容。这是怎么做到的?

我们来看这个例子:

我们有NS_ENUM名为UIViewControllerInitMode的模式kUIViewControllerInitModeOnekUIViewControllerInitModeTwo。现在是initviewDidLoad代码:

- (instancetype)initWithMode:(UIViewControllerInitMode)m
{
    self = [super init];
    if (self)
    {
         mode = m; //Assume that mode is a class variable
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (mode == kUIViewControllerInitModeOne) //Check the class variable
        self.view.backgroundColor = [UIColor blueColor];
    else //It's the InitModeTwo
        self.view.backgroundColor = [UIColor redColor];
}

现在这看起来像是一段完全合法的代码(至少对我来说)但是如果我的知识是正确的,UIViewController的实际视图会被延迟加载,所以无法判断视图是蓝色还是红色当类变量被设置时(除了一个额外的if但看起来很难看,因为它意味着我在initviewDidLoad中有相同的GUI代码)。那么这是否意味着在某些情况下,即使我init控制器使用应该为蓝色背景的模式,视图也可以具有红色背景?由于同样的原因,在init中设置背景颜色是不安全的,或者是这样吗?如果我按照上面的例子的方式做它总是有效,但我想深究这一点。这是如何在引擎盖下发生的?我在哪里对/错?

2 个答案:

答案 0 :(得分:0)

你的例子非常好。您可以在创建视图属性后设置它们。如果更改未显示,您可以通过调用

让视图再次绘制
[self.view setNeedsDisplay];

我认为在init中设置背景颜色会失败,因为视图尚未在init中初始化。但我不确定这一点。试试吧。

答案 1 :(得分:0)

我发现上面的代码没有问题。你是对的,你不应该触及init中的UI组件,因为那时他们很可能是nullinitWithMode方法不应该关心视图的颜色,因为它可能根本就没有颜色。 viewDidLoad方法用于更改视图和其他UI组件的显示属性。由于init将始终在viewDidLoad之前调用,因此您的视图应始终根据mode设置为红色或蓝色。