Dou*_*ith 3 cocoa-touch uiviewcontroller uiview ios
我想以编程方式创建一个 UIViewController 。没有笔尖或故事板。它基本上会被创建然后呈现,并且在它自己的类中它将设置要显示的图像。
然而,每当我只是alloc init一个视图控制器并呈现它时,它呈现时就会显示为黑色。
我认为这是因为它缺乏自己的观点?
当我在 Storyboard 中创建原始文件时UIViewController,它会自动设置视图,如何设置视图,使其像 Storyboard 一样具有正确的设备大小、旋转变化等?
希望这个答案能够澄清一些事情,即使已经有一个被接受的答案。我觉得那里给出的解释不够清楚,这可能就是为什么OP一开始没有遵循它,导致OP更加混乱,回答者在评论中变得尖刻,这对任何人都没有帮助。这不是这个网站的全部内容。
每当我分配初始化一个 [UIViewController] 并呈现它时,它呈现时都会显示为黑色。
它实际上并不是黑色的。它是透明的(或者更准确地说,它的视图是透明的),因此您真正看到的是视图后面的黑色(在这个简单的情况下,很可能是其UIWindow本身。)
这是因为您依赖于loadView您的默认实现UIViewController,它只是创建一个UIView实例,并且 aUIView的背景属性是nil默认的,因此它是透明的。然而,当您在界面生成器中进行设置时,它通常会backgroundColor为您将该属性设置为白色。
当然,您可以自己用代码简单地完成此操作。下面的示例准确地显示了这一点,只不过我使用的是绿色而不是白色,因此当您展示它时,您肯定会看到这个特定的视图:
UIViewController* plainViewController = [UIViewController new];
plainViewController.view.backgroundColor = [UIColor greenColor];
Run Code Online (Sandbox Code Playgroud)
UIViewController当然,在没有子类化的情况下使用 a 没有多大意义,但你可以。你只需要在外部管理一切,就像我上面所做的那样。
如果您执行subclass 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];
}
Run Code Online (Sandbox Code Playgroud)
或者使用自定义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;
}
Run Code Online (Sandbox Code Playgroud)
您还可以在 中初始化背景viewDidLoad,如下所示(这适用于上述任一版本。
- (void) viewDidLoad
{
// Set the background on whatever view is being managed
// regardless of where/how it was created
self.view.backgroundColor = [UIColor greenColor];
}
Run Code Online (Sandbox Code Playgroud)
注意:使用时viewDidLoad:
loadView完全删除,因为super现在不需要它来处理创建视图。loadView但删除设置属性的行,backgroundColor因为您现在是在viewDidLoad.然而,所有这三种方法的好处是现在视图的初始化包含在您的内部,UIViewController使重用更加容易。
顺便说一句, aUIWindow本身是 的子类UIView,因此,它也有一个backgroundColor属性(当然也是nil默认的。)因此,如果您将backgroundColor窗口的属性更改为 Purple,这就是您将拥有的属性看到而不是黑色(直到您在视图上设置背景颜色,它完全覆盖窗口。)
我认为这是因为它缺乏自己的观点?
希望上述原因能够澄清这个假设是错误的。它实际上就在那里,只是透明的。
如果视图尚不存在,则只需访问viewa 的属性即可创建该视图。UIViewController由于呈现新实例化的对象UIViewController需要访问其view属性才能实际呈现某些内容,即在创建视图时。但是,在上面的情况下,我显式访问该view属性以便可以backgroundColor在其上设置该属性,这就是创建视图的时间点。
不管怎样,希望这能更澄清你所看到的以及幕后实际发生的事情。一旦掌握了窍门,以编程方式创建和使用 ViewController 实际上非常简单。即便如此,通过 Interface Builder 使用 Storyboard 甚至 NIB 仍然要容易得多,因为您可以直观地看到您正在做什么。
| 归档时间: |
|
| 查看次数: |
5126 次 |
| 最近记录: |