swift 3 : Designable table view cell

标签 swift xcode swift3 interface-builder ibdesignable

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

有谁知道如何制作@Designable table view cell?

当我在带有表格 View 的 Storyboard中导入我的自定义表格 View 单元格时,只有背景颜色起作用。当我尝试在我的表格 View 单元格内设置标签文本时,界面生成器崩溃了。

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

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

谢谢!

最佳答案

我认为您可以在此处查看几个可能的问题。首先,无论何时创建自定义 View ,都需要将其与 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() 方法中进行任何 View 设置。

override func awakeFromNib() {
    if headerLabel != nil {
        self.backgroundColor = UIColor.blue
        self.headerLabel.text = "Hello world"
    }
}

最后,当我用检查是否没有当前 subview 包装设置函数时,我只能让 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 和自定义 View 。 http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

关于 swift 3 : Designable table view cell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43046924/

相关文章:

swift - 如何实现matchForInvite?

ios - 从选取器 View 中获取选定值的函数

swift - Xcode 12 和 OSLog (os.log) : wrapping OSLogMessage causes compile error: Argument must be a string interpolation

ios - Swift 按钮背景图像没有出现?

xml - 使用 Swift 3 pretty-print XML

swift - 非 -'@objc' 方法不满足 '@objc' 协议(protocol)的可选要求

ios - 撤销按钮 Swift

ios - swift & SpriteKit : Full screen image

ios - Spritekit 平行滚动

ios - 带有可视化工具的 AVPlayer