2016-01-13 44 views
1

我有一個UITableViewController坐在一個Container內,坐落在另一個UIViewController內。我把它製作成一個故事板。 Here is a snap.有問題的UITableViewController位於右側,稱爲LayerTableViewController爲什麼在單元格不可見時調用cellForRowAtIndexPath?

出於某種原因,此UITableView的cellForRowAtIndexPath方法正在爲當前不可見的單元調用。我通過將方法更改爲以下方法來測試此方法:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("layerCell", forIndexPath: indexPath) as! LayerTableViewCell 

    // Configure the cell... 

    cell.layerCircleView.layer.cornerRadius = cell.layerCircleView.layer.bounds.width/2 
    let label = UILabel(frame: CGRect(x: cell.layerCircleView.frame.midX - 10, y: cell.layerCircleView.frame.midY - 10, width: 20, height: 20)) 
    label.text = String(indexPath.row) 
    cell.layerCircleView.addSubview(label) 
    print("indexPath.row: \(indexPath.row)") 

    return cell 
} 

此代碼產生了以下奇怪的結果。在控制檯中,數字偶爾會被打亂。不在可見屏幕附近的單元將它們的indexPath.row傳遞給此方法。此外,我正在製作的UILabels都是相互重疊的。 Here is a combined image of the simulator and terminal output. 正如你所看到的,有一條隨機線表示indexPath.row: 0,當indexPath.row s坐在二十幾歲左右時。

所以總結一下,爲什麼有一個cellForRowAtIndexPath的調用,indexPath.row目前不可見,爲什麼這些數字會互相渲染?

回答

0

所以我仍然不確定爲什麼會有對cellForRowAtIndexPath的隨機調用,這些調用對於不可見的單元來說似乎並不是什麼大問題。我認爲這和疊加的渲染是連接的,但它們不是。

覆蓋渲染的問題是所有UILabels被添加到UITableViewCell的子視圖,即cell.layerCircleView。正如我所發現的那樣,當電池被重複使用時,參考layerCircleView也是如此。所以我所要做的就是修復它,一旦它離開屏幕就清理視圖:

override func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    let cell = cell as! LayerTableViewCell 
    for subview in cell.layerCircleView.subviews { 
     subview.removeFromSuperview() 
    } 
} 
相關問題