希望我的回答能够澄清一些事情,尽管已经有一个被接受的答案。我认为那里给出的解释不够清晰,这可能是为什么原始问题的提问者一开始没有按照它所说的去做,导致提问者更加困惑,回答者在评论中表现得很刻薄,这并没有帮助任何人。这不是这个网站的初衷。
当我只是分配并初始化 [UIViewController] 并呈现它时,它会以黑色显示出来。
实际上它不是黑色的。它是透明的(或者更准确地说,它的
view 是透明的),所以你真正看到的是从视图后面传来的黑色(在这种简单情况下,很可能是
UIWindow
本身)。
这是因为您依赖于您的
UIViewController
中的默认的
loadView
实现,该实现仅创建了一个
UIView
实例,并且
UIView
的背景属性默认为
nil
,因此它是透明的。 但是,在界面构建器中设置它时,它通常会为您设置
backgroundColor
属性为白色。
当然,您也可以在代码中自己实现这一点。 下面是一个示例,显示了完全相同的内容,只不过我使用的是绿色,因此当您呈现它时,您肯定会看到这个特定的视图:
UIViewController* plainViewController = [UIViewController new]
plainViewController.view.backgroundColor = [UIColor greenColor]
当然,使用
UIViewController
而不进行子类化并没有太多意义,但你可以这样做。你只需像我上面做的那样在外部管理所有内容。
如果你进行子类化
UIViewController
,你只需要实现自己的
loadView
方法来创建自己的
UIView
(或其子类),但请记住,在这里它也将是透明的,除非你显式设置其
backgroundColor
。以下是几种实现方式...
在自己的
UIViewController.m
子类中,用默认的
UIView
实例初始化背景...
- (void) loadView
{
[super loadView];
self.view.backgroundColor = [UIColor greenColor];
}
或者使用自定义的UIView
子类...
- (void) loadView
{
MyCustomUIView* myCustomUIView = [MyCustomUIView new];
myCustomUIView.backgroundColor = [UIColor greenColor];
self.view = myCustomUIView;
}
您也可以在viewDidLoad
中初始化背景,像这样(这适用于上述任何版本)。
- (void) viewDidLoad
{
self.view.backgroundColor = [UIColor greenColor];
}
注意:当使用
viewDidLoad
时:
- 在上述第一种情况下,您可以完全删除
loadView
,因为它不再需要,super
现在会处理创建视图。
- 在第二种情况下,保留
loadView
但删除设置backgroundColor
属性的那行代码,因为您现在是在viewDidLoad
中进行设置。
然而,所有这三种方法的好处是现在视图的初始化都包含在您的UIViewController
中,使得重用更加容易。
顺便提一下,UIWindow
本身是UIView
的子类,因此它也有一个backgroundColor
属性(默认情况下也是nil
)。因此,如果您将窗口的backgroundColor
属性更改为紫色,那么您看到的就是紫色而不是黑色(直到您在视图上设置背景颜色,这将完全覆盖窗口)。
我认为这是因为它缺少自己的视图?
希望上述原因澄清了这个错误的假设。它实际上存在,只是透明的。
仅仅访问UIViewController
的view
属性将创建视图,如果它不存在。由于呈现新实例化的UIViewController
需要访问其view
属性才能有东西进行呈现,因此在那时创建了视图。但是,在上述情况下,我明确访问view
属性以便在其上设置backgroundColor
属性,这是创建视图的时间点。
无论如何,希望这更清楚地解释了您看到的内容以及幕后发生的事情。一旦掌握了以编程方式创建和使用ViewControllers,就会变得非常简单。即使如此,使用故事板或甚至使用Interface Builder的NIB仍然更容易,因为您可以直观地看到自己所做的事情。