我尝试使用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()
}
}
答案 0 :(得分: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的类定义,结果是一个表格视图,其背景颜色为紫色。
有人说过,我可以猜测为什么你在设置表格视图的背景颜色时遇到问题。问题可能与视图生命周期有关。外观协议在它们出现在屏幕上之前应用于视图。您可能在视图生命周期中过早地实例化自定义视图实例,即在包含视图控制器的视图从其笔尖唤醒之前。因此,您尝试在尚未反序列化的视图上设置属性,因此不会显示所需的背景颜色设置。请参阅Apple开发人员文档中的以下引用。
如果您计划从nib文件加载自定义视图类的实例,您应该知道在iOS中,nib加载代码不使用initWithFrame:方法来实例化新的视图对象。相反,它使用initWithCoder:方法,该方法是NSCoding协议的一部分。
(参考:View Programming Guide for iOS)
值得指出的是,UITableView类通常仅作为子视图添加到UIViewController,同一视图控制器也充当表视图的委托和数据源。 Apple建议您使用预先配置的UITableViewController,它是一个UIViewController,其UITableView作为其视图,并且还充当数据源和委托。直接添加UITableView作为自定义视图类的子视图(如您所做)不是最佳做法,因此不鼓励。
有关使用UITableView类的更多信息,请参阅Apple官方文档: