如果不构建视图,是否无法以编程方式创建UIViewController?

时间:2015-06-12 17:21:53

标签: ios cocoa-touch uiview uiviewcontroller

我想以编程方式创建一个UIViewController。没有笔尖或故事板。它基本上会被创建然后呈现,并且在它自己的类中它将设置要显示的图像。

然而,每当我只是alloc init一个视图控制器并呈现它时,它就会呈现出黑色。

我认为这是因为它缺乏自己的观点?

当我在Storyboard中创建原始UIViewController时,它会自动将其设置为视图,如何设置视图,就像故事板一样,它是正确的设备大小,轮换更改等等?

3 个答案:

答案 0 :(得分:4)

希望这个答案在这里澄清一些事情,即使已经接受了答案。我没有感觉到那里的解释已经足够清楚了,这可能是为什么OP最初没有遵循它,导致OP更加混乱,而且回答者在评论中变得嗤之以鼻。 ; t帮助任何人。这不是这个网站的全部内容。

  

每当我只是为一个[UIViewController]分配init并呈现它时,它就会显示为黑色。

它实际上并不是黑色的。它是透明的(或者更确切地说,它的视图),所以你真正看到的是视图背后的黑色(在这个简单的例子中,很可能是{ {1}}本身。)

这是因为您依赖于UIWindowloadView的默认实现,它只创建了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]; } 时:

  1. 在上面的第一种情况下,您只需完全删除viewDidLoad,因为loadView现在可以处理创建视图。
  2. 在第二种情况下,您离开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)

来自documentation

  

如果您无法在故事板或nib文件中定义视图,   覆盖loadView方法以手动实例化视图层次结构   并将其分配给view属性。