- 我向每个内容添加子视图每个单元格的视图
- 每个单元格的子视图不同
- 我通过设置单元格的标记来识别它
- 由于单元格可以重复使用,在返回
cellForRowAtIndexPath
中的单元格之前,我首先删除它的所有子视图
[[cell.contentView子视图]makeObjectsPerformSelector:@selector(removeFromSuperview)];
我的问题是:
- 执行上述代码时,单元格未正确呈现。详细信息文本被截断
- 如果不执行上述语句,则detailText可以,但存在错误子视图
那么,当单元格被重新使用时,如何正确地从UITableViewCell.contentview中删除子视图呢??
是否有completionHandlet挂钩?
我应该在后台队列中运行上面的代码并在主队列中呈现单元格吗?这是正确的方法吗
这不是一个非常优雅的解决方案,但您可以标记自定义子视图,然后:用于子视图中的视图。。。如果view.tag==myTag//从superview 中删除
一个更好的解决方案是制作一些表视图单元格子类,重用您的自定义子视图。
我用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一起使用时,我们必须小心。