【问题标题】:Setting UIView's backgroundColor in loadView has no effect在loadView中设置UIView背景颜色没有效果
【发布时间】: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 中设置超级视图的背景颜色不起作用。

【问题讨论】:

    标签: ios iphone uiview uiviewcontroller ios7


    【解决方案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的特定子类,而不是泛型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-11
        相关资源
        最近更新 更多