gpt4 book ai didi

ios - 是否无法在不构建 View 的情况下以编程方式创建 UIViewController?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:01:14 24 4
gpt4 key购买 nike

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

然而,每当我只是alloc init一个 View Controller 并呈现它,它在呈现时呈现黑色。

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

当我创建一个原始 UIViewController在 Storyboard 中,它会自动设置一个 View ,我如何设置 View ,像 Storyboard 一样,它是正确的设备大小、旋转变化等?

最佳答案

希望这个答案在这里澄清了一些事情,即使已经有一个公认的答案。我觉得那里给出的解释不够清楚,这可能是 OP 一开始没有遵循它的原因,导致 OP 更加困惑并且回答者在评论中变得尖刻,这对任何人都没有帮助。这不是本网站的全部内容。

Whenever I just alloc init a [UIViewController] and present it, it comes out black as it is presented.



其实不是黑它是透明的(或者更准确地说,它的 View 是透明的)所以你真正看到的是 View 后面的黑色(在这个简单的例子中,很可能是 UIWindow 本身。)

这是因为您依赖于 loadView 的默认实现在您的 UIViewController这只是创建一个 UIView实例,和一个 UIView的背景属性是 nil默认情况下,因此它是透明的。然而,当你在界面构建器中设置它时,它通常会设置 backgroundColor属性白给你。

您当然可以简单地自己在代码中完成此操作。这是一个示例,除了我使用绿色而不是白色外,当您展示它时,您肯定会看到这个特定 View :
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现在将处理创建 View 。
  • 在第二种情况下,您离开 loadView但删除您设置 backgroundColor 的行属性(property),因为您现在在 viewDidLoad 中这样做.

  • 然而,所有这三种方法的好处是现在 View 的初始化包含在您的 UIViewController 中。使重用更容易。

    附带说明, UIWindow本身是 UIView 的子类,因此,它还有一个 backgroundColor属性(当然也是 nil 默认情况下。)因此,如果您更改 backgroundColor窗口的属性说紫色,这就是您所看到的而不是黑色的(直到您在 View 上设置完全覆盖窗口的背景颜色。)

    I assume this is because it lacks its own view?



    希望上述原因澄清了这个假设是错误的。它实际上就在那里,只是透明的。

    简单访问 view 的行为 UIViewController 的属性如果它不存在,将创建 View 。由于呈现了一个新实例化的 UIViewController需要访问其 view属性具有实际呈现的内容,即创建 View 时。但是,在上述情况下,我明确访问了 view属性,以便我可以设置 backgroundColor属性,那是创建 View 的时间点。

    无论如何,希望这能更清楚地说明您所看到的以及幕后实际发生的事情。一旦掌握了它,以编程方式创建和使用 ViewControllers 实际上非常简单。即便如此,在 Interface Builder 中使用 Storyboard 甚至 NIB 仍然容易得多,因为您可以直观地看到您在做什么。

    关于ios - 是否无法在不构建 View 的情况下以编程方式创建 UIViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30808840/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com