cellForRowAtIndexPath
[[cell.contentView子视图] makeObjectsPerformSelector:@selector(removeFromSuperview)];
我的问题是:
那么,当重新使用单元格时,如何正确地从UITableViewCell.contentview中删除子视图?
是否有completionHandlet挂钩?
我应该在后台队列中运行上面的代码并在主队列中渲染单元格吗?这是正确的方法吗?
答案 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东西时,我们必须要小心。