繁体   English   中英

自定义UIViewController init与init相关的数据

[英]Custom UIViewController init with init related data

我有一个关于UIViewControllers上的自定义init方法的问题。 假设我编写了一个带有一个参数的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设置背景颜色还是不安全的? 如果我按照上述示例的方式进行操作,它总是可以工作的,但是我想深入了解这一点。 这是怎么发生的呢? 我在哪里是对还是错?

您的例子很好。 您可以在创建视图属性后对其进行设置。 当您的更改未显示时,您可以通过调用

[self.view setNeedsDisplay];

我猜在init中设置背景颜色会失败,因为视图尚未在init中初始化。 但是我不确定。 去尝试一下。

我认为上面的代码没有问题。 没错,您不应该触摸init UI组件,因为那时UI组件很可能为null initWithMode方法不应该在乎视图是什么颜色,因为它可能根本没有颜色。 viewDidLoad方法用于更改视图和其他UI组件的显示属性。 由于init将始终在viewDidLoad之前被调用,因此您应根据mode将视图始终设置为红色或蓝色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM