UITableView backgroundColor 和 UITableView.appearance

Posted

技术标签:

【中文标题】UITableView backgroundColor 和 UITableView.appearance【英文标题】:UITableView backgroundColor and UITableView.appearance 【发布时间】:2015-11-10 02:44:30 【问题描述】:

我正在尝试创建一个包含 UITableView 的简单视图。 我想通过表视图的 backgroundColor 属性将表视图的背景颜色更改为紫色。 Apple 文档说您只需将 backgroundView 属性设置为 nil 即可工作。就我而言,它不起作用。

我必须调用 UITableView.appearance().backgroundColor = UIColor.purpleColor() 让它工作而不仅仅是 UITableView.backgroundColor = UIColor.purleColor()

我的问题是为什么?

这是代码:

class TaskTableView: UIView 
    var tableView = UITableView(frame: CGRectZero, style: .Plain)

    override init(frame: CGRect) 
        super.init(frame: frame)

        tableView.backgroundView = nil
        tableView.backgroundColor = UIColor.purpleColor()
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        tableView.translatesAutoresizingMaskIntoConstraints = false
        addSubview(tableView)

        let views = ["table": tableView]
        addConstraints(
            NSLayoutConstraint.constraintsWithVisualFormat("|[table]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
        )

        addConstraints(
            NSLayoutConstraint.constraintsWithVisualFormat("V:|[table]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views)
        )
    

    required init?(coder aDecoder: NSCoder) 
        fatalError()
    



【问题讨论】:

【参考方案1】:

以编程方式创建新视图(自定义子类TaskTableView)时,上面提供的示例代码对我来说很好:

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tableViewFrame : CGRect = CGRectMake(20, 20, 100, 300)
        let taskTableView  : TaskTableView = TaskTableView.init(frame: tableViewFrame)

        view.addSubview(taskTableView)
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


当在一个空白的新项目中运行此代码时,使用问题中提供的 TaskTableView 的类定义,结果是一个具有所需紫色背景颜色的表格视图。

话虽如此,我可以猜测为什么您在设置表格视图的背景颜色时遇到问题。问题可能与视图生命周期有关。外观协议在视图出现在屏幕上之前应用于视图。您可能在视图生命周期中过早地实例化自定义视图实例,即在包含视图的视图控制器从其 nib 唤醒之前。因此,您尝试在尚未反序列化的视图上设置属性,因此不会显示所需的背景颜色设置。请参阅 Apple 开发者文档中的以下引用。

如果您计划从 nib 文件加载自定义视图类的实例,您应该知道在 ios 中,nib 加载代码不使用 initWithFrame: 方法来实例化新的视图对象。相反,它使用 initWithCoder: 方法,该方法是 NSCoding 协议的一部分。

(参考:View Programming Guide for iOS)

值得指出的是,UITableView 类通常仅作为子视图添加到 UIViewController,而同一个视图控制器还充当 Table View 的委托和数据源。 Apple 建议您使用他们预先配置的 UITableViewController,它是一个 UIViewController,以 UITableView 作为其视图,同时也充当数据源和委托。将 UITableView 直接添加为自定义 view 类的子视图(如您所做的那样)不是最佳实践,因此不鼓励。

有关使用 UITableView 类的更多信息,请参阅 Apple 官方文档:

UITableView class reference Table View Programming Guide for iOS

【讨论】:

"外观协议在视图出现在屏幕上之前应用到它们。"基本上这意味着它会覆盖我的初始设置

以上是关于UITableView backgroundColor 和 UITableView.appearance的主要内容,如果未能解决你的问题,请参考以下文章

UIView 渐渐出现 和渐渐消失了动画效果

在 UIImageView 上使用 Tint 颜色

C# 控制台设置

使用淡入淡出动画从布尔[重复]更改背景颜色视图

电力项目七--js控制文字内容过长的显示

在 AppDelegate 中实现后隐藏自定义状态栏视图