在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
的主要原因是自定义UIViewController
的view
属性,大概是使用UIView
的特定子类,而不是泛型。
【讨论】:
以上是关于在loadView中设置UIView背景颜色没有效果的主要内容,如果未能解决你的问题,请参考以下文章
XCODE:UIView 背景没有出现在屏幕上,即使我在情节提要中设置了颜色并以编程方式
无法在 Swift 中设置 UITableViewCell 中使用的 UIView 子类的背景颜色