我对init
专门针对自定义UIViewControllers
方法提出了疑问。假设我写了一个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
中设置背景颜色是不安全的,或者是这样吗?如果我按照上面的例子的方式做它总是有效,但我想深究这一点。这是如何在引擎盖下发生的?我在哪里对/错?
答案 0 :(得分:0)
你的例子非常好。您可以在创建视图属性后设置它们。如果更改未显示,您可以通过调用
让视图再次绘制[self.view setNeedsDisplay];
我认为在init中设置背景颜色会失败,因为视图尚未在init中初始化。但我不确定这一点。试试吧。
答案 1 :(得分:0)
我发现上面的代码没有问题。你是对的,你不应该触及init
中的UI组件,因为那时他们很可能是null
。 initWithMode
方法不应该关心视图的颜色,因为它可能根本就没有颜色。 viewDidLoad
方法用于更改视图和其他UI组件的显示属性。由于init
将始终在viewDidLoad
之前调用,因此您的视图应始终根据mode
设置为红色或蓝色。