【问题标题】:Swift 3: Designable table view cellSwift 3:可设计的表格视图单元
【发布时间】:2017-03-27 12:48:41
【问题描述】:

我在界面构建器中可视化我的自定义表格视图单元格时遇到了一些问题。

有人知道如何制作@Designable 表格视图单元格吗?

当我在带有表格视图的情节提要中导入自定义表格视图单元格时,只有背景颜色有效。当我尝试在表格视图单元格中设置标签文本时,界面构建器崩溃。

我的设置是通过以下方法调用的:

- 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)
 }
}

谢谢!

【问题讨论】:

  • 请添加 tbaleView 数据源方法。
  • 添加了数据源方法。我正在尝试在可设计的 UITableViewCell 中设置标签,这意味着我的标签上有一个 IBOutlet?那不应该初始化吗?
  • 您能否发布一些代码以进行更多说明?
  • 是的,我编辑了我的问题。 xib 文件更新背景颜色,但是当我尝试更新 headerLabel 的文本时,IB builder 崩溃

标签: swift xcode swift3 interface-builder ibdesignable


【解决方案1】:

我认为您可以在此处查看几个可能的问题。首先,无论何时创建自定义视图,都需要将其与 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 当我学习这个时,我发现这篇博文非常有帮助。您可能想自己通读以掌握 IBDesignable 和自定义视图。 http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

【讨论】:

  • 感谢您的回答!我仍然无法使用我的自定义单元格在 IB 中工作,但现在它不再崩溃了。当前运行代码在原帖中更新^^。它只更新我在情节提要中的自定义视图,当我使用 prepareForInterfaceBuilder() 时,如上所示,我可以将背景颜色设置为蓝色。但此时标签为 nil。
  • 不要从 nib 调用 awake,该方法会为你调用。
  • 如果我删除:覆盖 func prepareForInterfaceBuilder() { self.awakeFromNib() } IB 中没有呈现任何内容
  • 你实现了init(frame: CGRect)方法了吗?
  • 好吧,我想我找到了为什么没有调用它的问题。我删除了 if self.subviews.count == 0 { self.setupNib() }。然后它更新了我的 IB。感谢您的帮助!
猜你喜欢
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多