2017-03-27 53 views
1

我在界面生成器中使用自定義表格視圖單元格時遇到了一些麻煩。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

回答

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

而且,每當我與廈門國際銀行文件的工作,我做的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

相關問題