[英]Custom UIViewController init with init related data
我有一个关于UIViewControllers
上的自定义init
方法的问题。 假设我编写了一个带有一个参数的init
方法(比如说UIViewControllerInitMode
),该参数负责指示视图应以哪种方式加载。 因此,当调用viewDidLoad
时,将检查该参数(现在存储为类变量),并相应地加载与GUI相关的内容。 怎么做?
让我们来看这个例子:
我们有一个NS_ENUM
称为UIViewControllerInitMode
与模式kUIViewControllerInitModeOne
和kUIViewControllerInitModeTwo
。 现在查看init
和viewDidLoad
代码:
- (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,但这看起来很难看,因为这意味着我在init
和viewDidLoad
具有相同的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.