2016-02-08 161 views
0

我將數據傳遞給自定義UITableViewCell並基於該數據顯示或隱藏動態添加的子視圖。我正在重用故事板中創建的單元格。一切都按預期工作,直到某些單元格被重用爲止,例如在滾動它時將「隨機」隱藏或顯示動態添加的子視圖。將數據傳遞給自定義UITableViewCell並添加子視圖

我需要什麼

我需要的方式通過方法(使用setData)來設置一個單元的數據,增加一個動態創建的子視圖,同時允許細胞而不產生毛刺被重用它的外觀,特別是增加的子視圖以及細胞狀態。

問題

我不知道我應該創建子視圖,因此它不具有當電池被重複使用,以重新創建,所以它不會錯誤時,我想隱藏或在setData方法中顯示它。同時創建新的子視圖時可以訪問IBOutlet storyboardLabel。

CustomTableViewCell

class CustomTableViewCell : UITableViewCell { 
    var data: DataItem? 
    var customSubview: UIView? 

    @IBOutlet weak var storyboardLabel: UILabel! 

    //setting the data of a cell and adding the subview 
    func setData(DataItem data) { 
     // adding the view 
     let customSubview = UIView.init(...) 
     customSubview.bounds = storyboardLabel.bounds 
     customSubview.hidden = data.showSubview 
     self.contentView.addSubview(customSubview) 
    } 
} 

添加細胞

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("storyboardTableCell") as! CustomTableViewCell 
    cell.setData(self.data[indexPath.section][indexPath.row] as! DataItem) 
    return cell 
} 
+1

你看過'prepareForReuse()'了嗎? – Eendje

+0

我確實做了,但是我正在尋找一個解決方案,而不重新創建子視圖,如果有的話。因爲在我看來,重新使用它時似乎沒有必要再使用它。 –

+0

你可以做的是懶洋洋地創建子視圖並在'prepareForReuse'中檢查它是否存在並隱藏它。我認爲SwiftArchitect的解釋應該足夠了,但如果你仍然需要幫助,我可以告訴你如何。 – Eendje

回答

0

一切工作正常,直到某些細胞被重用......

沒有什麼工作的預計:您正在將對象添加到緩存的UITableViewCell,並且當然,當您在後續的cellForRowAtIndexPath上再次傳遞該緩存單元格時,您正在添加新的對象。

考慮使用的視圖的集合在IB,分別滿足您的細胞組織,從而節省編程添加子視圖。

你需要清理你的細胞。

  • 要麼刪除一切你已經在你的cellForRowAtIndexPath
    • 您可以使用tagsviewWithTag,如果你想從重新加入已經存在的意見
  • 或實施以避免增加prepareForReuse()

你可以在this Stack Overflow post上找到一個例子(和類似的討論)。

相關問題