Swift 3:设计表格视图单元格

问题描述:

我在界面生成器中使用自定义表格视图单元格时遇到了一些麻烦。Swift 3:设计表格视图单元格

有谁知道如何使@Designable表视图细胞?

当我输入我的自定义表视图细胞与tableview中故事板,只有背景色工作。当我尝试在我的表视图单元格中设置标签的文本时,界面生成器崩溃。

我的设置是从以下方法叫:

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

谢谢!

+0

请添加tbaleView数据源方法。 – CodeChanger

+0

添加数据源方法。我试图在我的可设计的UITableViewCell中设置标签,这意味着我的标签上有一个IBOutlet?不应该初始化吗? – PAK

+0

你可以发布一些代码以获得更多的解释吗? – CodeChanger

我认为有几个你可以看看这里可能出现的问题。首先,无论何时创建自定义视图,都需要将其与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) 
} 

而且,每当我与厦门国际银行文件的工作,我做的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() 
    { 
} 

PS当我学习这一点,我发现这篇博文很有帮助。您可能需要自己阅读以获得IBDesignable和自定义视图的处理。 http://supereasyapps.com/blog/2014/12/15/create-an-ibdesignable-uiview-subclass-with-code-from-an-xib-file-in-xcode-6

+0

谢谢您的回答!我仍然无法使用自定义单元格在IB中工作,但现在它不再崩溃。当前运行的代码在原始文章^^中更新。它只是在故事板中更新我的自定义视图,当我使用prepareForInterfaceBuilder()时,如上所示,我可以将背景颜色设置为蓝色。但目前这个标签是零。 – PAK

+0

不要从nib调用唤醒,该方法将被调用。 – faircloud

+0

如果我删除: 重写func prepareForInterfaceBuilder(){ self。awakeFromNib() } IB中没有呈现任何内容 – PAK