希望这个答案在这里澄清了一些事情,即使已经有一个公认的答案。我觉得那里的解释不够清楚,这可能就是为什么 OP 一开始没有遵循它,导致 OP 更加混乱,并且回答者在 cmets 中变得尖刻,这对任何人都没有帮助。这不是这个网站的全部内容。
每当我只是分配初始化一个 [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]; // Actually loads and assigns the default view
// Set the background on the default view
self.view.backgroundColor = [UIColor greenColor];
}
或者使用自定义的UIView 子类...
- (void) loadView
{
// Create and initialize your custom view
MyCustomUIView* myCustomUIView = [MyCustomUIView new];
myCustomUIView.backgroundColor = [UIColor greenColor];
// You're setting the view so do *not* call [super loadView]
self.view = myCustomUIView;
}
您也可以在viewDidLoad 中初始化背景,就像这样(这适用于上述任何一个版本。
- (void) viewDidLoad
{
// Set the background on whatever view is being managed
// regardless of where/how it was created
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 仍然要容易得多,因为您可以直观地看到自己在做什么。