Swift 3: 可设计 table 视图单元格
Swift 3: Designable table view cell
我在界面生成器中可视化自定义 table 视图单元时遇到了一些问题。
有谁知道如何制作 @Designable
table 视图单元格?
当我在带有 table 视图的故事板中导入自定义 table 视图单元格时,只有背景颜色有效。当我尝试在我的 table 视图单元格中设置标签文本时,界面生成器崩溃了。
我的设置是通过以下方法调用的:
- override public init(style: UITableViewCellStyle, reuseIdentifier: String?)
- required public init?(coder aDecoder: NSCoder)
我认为这是因为我的标签此时没有初始化?
代码:
import UIKit
@IBDesignable class ProgressHeaderTableViewCell: UITableViewCell {
@IBOutlet weak var headerLabel: UILabel!
// MARK: - View methods
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setupNib()
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setupNib()
}
func setupNib(){
self.backgroundColor = UIColor.blue
// self.headerLabel.text = "Hello world"
}
}
更新代码:
import UIKit
@IBDesignable class CustomTableView: UITableViewCell {
@IBOutlet weak var headerLabel: UILabel!
// MARK: - View methods
override func prepareForInterfaceBuilder() {
self.awakeFromNib()
}
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.backgroundColor = UIColor.blue
if headerLabel != nil {
self.headerLabel.text = "Hello world"
}
}
func setupNib(){
let bundle = Bundle(for: CustomTableView.self)
guard let customView = bundle.loadNibNamed("CustomTableView",owner: self, options: nil)?.first as? CustomTableView else {
return
}
customView.frame = self.bounds
self.addSubview(customView)
}
}
谢谢!
我认为您可以在此处查看几个可能的问题。首先,无论何时创建自定义视图,都需要将其与 xib 文件名相关联。
func setupNib(){
let bundle = Bundle(for: ProgressHeaderTableViewCell.self)
guard let customView = bundle.loadNibNamed("NAME_OF_XIB_FILE_GOES_HERE",owner: self, options: nil)?.first as? ProgressHeaderTableViewCell else {
return
}
customView.frame = self.bounds
self.addSubview(customView)
}
此外,每当我使用 xib 文件时,我都会在检查以确保其中一个预期元素不为零后,在 awakeFromNib()
方法中进行任何视图设置。
override func awakeFromNib() {
if headerLabel != nil {
self.backgroundColor = UIColor.blue
self.headerLabel.text = "Hello world"
}
}
最后,当我用检查是否没有当前子视图来包装设置函数时,我只能让 IBDesignables 工作:
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
P.S 当我学习这个的时候,我发现这个博客 post 非常有帮助。您可能想自己通读以了解 IBDesignable 和自定义视图。 http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6
我在界面生成器中可视化自定义 table 视图单元时遇到了一些问题。
有谁知道如何制作 @Designable
table 视图单元格?
当我在带有 table 视图的故事板中导入自定义 table 视图单元格时,只有背景颜色有效。当我尝试在我的 table 视图单元格中设置标签文本时,界面生成器崩溃了。
我的设置是通过以下方法调用的:
- override public init(style: UITableViewCellStyle, reuseIdentifier: String?)
- required public init?(coder aDecoder: NSCoder)
我认为这是因为我的标签此时没有初始化?
代码:
import UIKit
@IBDesignable class ProgressHeaderTableViewCell: UITableViewCell {
@IBOutlet weak var headerLabel: UILabel!
// MARK: - View methods
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setupNib()
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setupNib()
}
func setupNib(){
self.backgroundColor = UIColor.blue
// self.headerLabel.text = "Hello world"
}
}
更新代码:
import UIKit
@IBDesignable class CustomTableView: UITableViewCell {
@IBOutlet weak var headerLabel: UILabel!
// MARK: - View methods
override func prepareForInterfaceBuilder() {
self.awakeFromNib()
}
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
override func awakeFromNib() {
super.awakeFromNib()
self.backgroundColor = UIColor.blue
if headerLabel != nil {
self.headerLabel.text = "Hello world"
}
}
func setupNib(){
let bundle = Bundle(for: CustomTableView.self)
guard let customView = bundle.loadNibNamed("CustomTableView",owner: self, options: nil)?.first as? CustomTableView else {
return
}
customView.frame = self.bounds
self.addSubview(customView)
}
}
谢谢!
我认为您可以在此处查看几个可能的问题。首先,无论何时创建自定义视图,都需要将其与 xib 文件名相关联。
func setupNib(){
let bundle = Bundle(for: ProgressHeaderTableViewCell.self)
guard let customView = bundle.loadNibNamed("NAME_OF_XIB_FILE_GOES_HERE",owner: self, options: nil)?.first as? ProgressHeaderTableViewCell else {
return
}
customView.frame = self.bounds
self.addSubview(customView)
}
此外,每当我使用 xib 文件时,我都会在检查以确保其中一个预期元素不为零后,在 awakeFromNib()
方法中进行任何视图设置。
override func awakeFromNib() {
if headerLabel != nil {
self.backgroundColor = UIColor.blue
self.headerLabel.text = "Hello world"
}
}
最后,当我用检查是否没有当前子视图来包装设置函数时,我只能让 IBDesignables 工作:
override public init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
// MARK: - NSCoding
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
//check that there are no current subviews
if self.subviews.count == 0 {
self.setupNib()
}
}
P.S 当我学习这个的时候,我发现这个博客 post 非常有帮助。您可能想自己通读以了解 IBDesignable 和自定义视图。 http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6