我想以编程方式创建一个UIViewController。没有笔尖或故事板。它基本上会被创建然后呈现,并且在它自己的类中它将设置要显示的图像。
然而,每当我只是alloc init
一个视图控制器并呈现它时,它就会呈现出黑色。
我认为这是因为它缺乏自己的观点?
当我在Storyboard中创建原始UIViewController
时,它会自动将其设置为视图,如何设置视图,就像故事板一样,它是正确的设备大小,轮换更改等等?
答案 0 :(得分:4)
希望这个答案在这里澄清一些事情,即使已经接受了答案。我没有感觉到那里的解释已经足够清楚了,这可能是为什么OP最初没有遵循它,导致OP更加混乱,而且回答者在评论中变得嗤之以鼻。 ; t帮助任何人。这不是这个网站的全部内容。
每当我只是为一个[UIViewController]分配init并呈现它时,它就会显示为黑色。
它实际上并不是黑色的。它是透明的(或者更确切地说,它的视图),所以你真正看到的是视图背后的黑色(在这个简单的例子中,很可能是{ {1}}本身。)
这是因为您依赖于UIWindow
中loadView
的默认实现,它只创建了UIViewController
个实例和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
中执行该操作。< / LI>
醇>
所有这三种方法的好处是,现在视图的初始化包含在viewDidLoad
中,使重用变得更加容易。
在旁注中,UIViewController
本身是UIWindow
的子类,因此,它还具有UIView
属性(默认情况下也是backgroundColor
当然。)因此,如果你将窗口的nil
属性改为紫色,那就是你所看到的而不是黑色(直到你在视图上设置背景颜色,完全覆盖窗户。)
我认为这是因为它缺乏自己的观点?
希望上述理由澄清了这一假设是错误的。实际上它只是透明的。
如果视图尚未存在,则只需访问backgroundColor
的{{1}}属性即可创建视图。由于呈现新实例化的view
需要访问其UIViewController
属性以实际存在某些内容,即创建视图时。但是,在上面我明确访问UIViewController
属性的情况下,我可以在其上设置view
属性, 是创建视图的时间点。
无论如何,希望这能更清楚地说明你所看到的以及幕后实际发生的事情。实际上,一旦你掌握了它,就可以通过编程方式创建和使用ViewControllers。即便如此,使用界面生成器使用故事板甚至NIB仍然要容易得多,因为您可以直观地看到自己在做什么。
答案 1 :(得分:3)
但是,每当我只是为一个视图控制器分配一个视图控制器并呈现它时,它就会显示为黑色。
因为它只是一个原始的UIViewController。你无法修改/定制它;这不是你的课。
相反,创建一个UIViewController 子类,例如MyCoolViewController,并实例化并呈现 。不同之处在于,使用MyCoolViewController,您可以覆盖viewDidLoad
和其他方法,以便将一些有用的接口放入其view
。
不要担心;所有这一切都将自动发生,因为视图由视图控制器管理,视图控制器正确放置在视图控制器层次结构中(例如,通过说如何设置视图,就像故事板一样,设备大小合适,轮换更改等等
presentViewController:...
)。
答案 2 :(得分:1)
如果您无法在故事板或nib文件中定义视图, 覆盖loadView方法以手动实例化视图层次结构 并将其分配给view属性。