在loadView中设置UIView背景颜色没有效果

Posted

技术标签:

【中文标题】在loadView中设置UIView背景颜色没有效果【英文标题】:Setting UIView's backgroundColor in loadView has no effect 【发布时间】:2013-12-06 15:27:12 【问题描述】:

我在 ios 7 应用中有一个UIDatePicker。它被添加到视图控制器(子类)中,因为背景是黑色的,所以它几乎不可读。 (日期选择器需要浅色背景。)

- (void)loadView

    self.datePicker = [[UIDatePicker alloc] init];
    ...
    [self.view addSubview:self.datePicker];

    // When placed here, without viewDidAppear, background remains black/transparent
    self.view.backgroundColor = [UIColor whiteColor];


- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    // When places here, the background becomes indeed white.
    self.view.backgroundColor = [UIColor whiteColor];

我当然可以在loadView 中设置日期选择器本身的背景颜色,这就是我最终要做的。

但我仍然不明白为什么在loadView 中设置超级视图的背景颜色不起作用。

【问题讨论】:

【参考方案1】:

您应该使用-viewDidLoad 而不是-loadView

【讨论】:

【参考方案2】:

如文档所述,每当访问 viewcontrollers 视图属性并且视图属性为 nil 时,都会调用 loadView。如果一个 NIB 与控制器相关联,他的方法将从 NIB 加载视图,否则它将创建一个视图。

文档还指出,如果您的自定义实现不应调用 super,但这将需要您创建自己的视图。

self.view = [UIView new]

没有self.view,因为你没有调用[super loadView];,调用super会为你创建视图。但是,如果您要覆盖此方法,则应该创建自己的视图。如文档中所述。

Beter 是使用viewDidLoad 在视图加载时调用,无论是从NIB、情节提要还是以编程方式。

-(void) viewDidLoad
    self.datePicker = [[UIDatePicker alloc] init];

    [self.view addSubview:self.datePicker];

    self.view.backgroundColor = [UIColor whiteColor];

【讨论】:

感谢您的广泛回答!【参考方案3】:

您可能应该在-viewWillAppear: 中设置背景颜色。来自docs 为 -[UIViewController loadView]:

视图控制器在其视图属性被请求但当前为 nil 时调用此方法。此方法加载或创建视图并将其分配给视图属性。

我今天还没有测试它,但是我读到这个是说self.view 在调用-loadView 时是nil,直到你明确地设置它。重写-loadView的主要原因是自定义UIViewControllerview属性,大概是使用UIView的特定子类,而不是泛型。

【讨论】:

以上是关于在loadView中设置UIView背景颜色没有效果的主要内容,如果未能解决你的问题,请参考以下文章

XCODE:UIView 背景没有出现在屏幕上,即使我在情节提要中设置了颜色并以编程方式

无法在 Swift 中设置 UITableViewCell 中使用的 UIView 子类的背景颜色

如何在OpenGL中设置背景颜色

如何在 Flutter 中设置主屏幕的背景颜色?

尝试在 Swift 5 中设置 UISearchController 的背景颜色

在 Swift 中设置活动标签栏项目的背景颜色