重新使用单元格时如何正确删除UITableViewCell.contentview中的子视图

时间:2015-02-16 22:23:11

标签: ios objective-c uitableview

  • 我将子视图添加到每个单元格的每个contentView
  • 每个单元格的
  • 子视图都不同
  • 我通过设置标签来识别单元格
  • 由于可以重复使用单元格,因此我先在cellForRowAtIndexPath
  • 中返回单元格之前删除其所有子视图
  

[[cell.contentView子视图]   makeObjectsPerformSelector:@selector(removeFromSuperview)];

我的问题是:

    执行上述代码时,
  • 单元格无法正确呈现。 detailText 已被截止
  • 如果不执行上述声明,detailText就可以了,但错误 子视图就在那里。

那么,当重新使用单元格时,如何正确地从UITableViewCell.contentview中删除子视图?

是否有completionHandlet挂钩?

我应该在后台队列中运行上面的代码并在主队列中渲染单元格吗?这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

不是一个非常优雅的解决方案,但您可以标记自定义子视图,然后:   用于在子视图中查看...   如果view.tag == myTag //从superview中删除

更好的解决方案是制作一些表格查看单元格子类,重复使用自定义子视图。

答案 1 :(得分:0)

我已经在swift中写了一堆代码来模拟你的问题,事情正常(考虑到子视图的小复杂性):

//
//  ViewController.swift
//  example
//
//  Created by Tiago Maia Lopes on 2/17/15.
//  Copyright (c) 2015 -. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

  @IBOutlet weak var tableView: UITableView!

  override func viewDidLoad() {
super.viewDidLoad()

tableView.rowHeight = 80
  }
}

extension ViewController: UITableViewDataSource {
  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
  }
}

extension ViewController: UITableViewDelegate {
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("identifier") as? UITableViewCell

if cell == nil {
  cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "identifier")
} else {
  cell?.contentView.subviews.map {
    currentSubview in
    (currentSubview as UIView).removeFromSuperview()
  }

  if indexPath.row % 2 == 0 {
    let otherTitle = UILabel(frame: CGRectMake(10, 50, 150, 30))
    otherTitle.text = "My Title testing"
    cell?.contentView.addSubview(otherTitle)

    let button = UIButton(frame: CGRectMake(170, 30, 100, 40))
    button.backgroundColor = .greenColor()
    cell?.contentView.addSubview(button)
  } else if indexPath.row % 3 == 0 {

    let boxView = UIView(frame: CGRectMake(10, 50, 130, 30))
    boxView.backgroundColor = .blackColor()
    cell?.contentView.addSubview(boxView)

    let otherButton = UIButton(frame: CGRectMake(140, 50, 70, 30))
    otherButton.backgroundColor = .brownColor()
    cell?.contentView.addSubview(otherButton)

  } else {
    let otherTitle = UILabel(frame: CGRectMake(10, 50, 150, 30))
    otherTitle.text = "OTHER TITLE TESTING"
    cell?.contentView.addSubview(otherTitle)
  }
}

println(cell?.subviews.count)

cell?.textLabel?.text = "TESTING"

return cell!
  }
}

我不知道此代码是否可以帮助您完成工作。我建议你为更复杂的视图相关的东西创建一个UITableViewCell子类,就像这个。这个类可以有一些辅助方法(例如addViews和removeViews),并包含一些布局位置代码,这些代码将在layoutSubviews方法中执行(当重用单元格时调用此方法)。此外,使用AL定位视图和设置标志以确保仅添加一次约束会很有帮助。关于你的上一个问题,在后台执行UI相关的东西不是一个好主意,行为可能很难调试和意外。当使用GCD和相关的UI东西时,我们必须要小心。