早上好
我的问题是我的表视图在我向下再向上滚动时重用所选单元格。我的意思是当我从上向下选择一个单元格然后向下滚动时,我选择的一些单元格被选中,也选择了一些选定单元格当我再次向上滚动时,从上面看不显示,当发生这种情况时,我再次选择苹果不仅仅是一个必须不被允许的单元格...我想提一下,我试图从'didSelectRowAtIndexPath保存旧的索引路径'我在'CellForRowAtIndexPath'中检查了它,但它不起作用:
if (old == indexpath)
{
cell?.backgroundColor = UIColor.redColor()
cell?.textLabel?.backgroundColor = UIColor.whiteColor() //to change only the thumbnail color and keep the cell color
}
else {
cell?.backgroundColor = UIColor.whiteColor()
}
现在这是我的代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = myTable.dequeueReusableCellWithIdentifier("WorkCell") as UITableViewCell
cell.tag = (indexPath.row) + 1
cell.textLabel?.text = Berufs[indexPath.row]
var img = UIImageView(frame: CGRect(x: 10, y: 3, width: 40 , height: 40))
cell.selectionStyle = UITableViewCellSelectionStyle.None
img.image = UIImage(named: "transparent.png")
cell.indentationLevel = 1
cell.indentationWidth = 45
cell.addSubview(img)
return cell
}
var old = 1000
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
let indexPath = tableView.indexPathForSelectedRow()
let cell = tableView.cellForRowAtIndexPath(indexPath!)
var tmpCell = view.viewWithTag(old)
var rowNum = (cell?.tag)! - 1
if (cell?.backgroundColor == UIColor.redColor())
{
cell?.backgroundColor = UIColor.whiteColor()
}
else if (cell?.backgroundColor != UIColor.redColor())
{
tmpCell?.backgroundColor = UIColor.whiteColor()
cell?.backgroundColor = UIColor.redColor()
cell?.textLabel?.backgroundColor = UIColor.whiteColor()
println("du interssiert dich für \(Berufs[rowNum])")
}
old = rowNum + 1
}
答案 0 :(得分:15)
您当前将选择状态存储在backgroundColor中。这不是一个好主意,因为出于性能原因,tableView将重用单元格。
您应该将选定的indexPath保存在数据模型中。如果要允许多个选择,可以将选定的indexPath存储在NSMutableSet中。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.selectionStyle = .None
configure(cell, forRowAtIndexPath: indexPath)
return cell
}
var selectedIndexPaths = NSMutableSet()
func configure(cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.textLabel!.text = "Row \(indexPath.row)"
if selectedIndexPaths.containsObject(indexPath) {
// selected
cell.backgroundColor = UIColor.redColor()
}
else {
// not selected
cell.backgroundColor = UIColor.whiteColor()
}
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedIndexPaths.containsObject(indexPath) {
// deselect
selectedIndexPaths.removeObject(indexPath)
}
else {
// select
selectedIndexPaths.addObject(indexPath)
}
let cell = tableView.cellForRowAtIndexPath(indexPath)!
configure(cell, forRowAtIndexPath: indexPath)
}
如果您只需要单一选择,则应将选定的indexPath保存在NSIndexPath中?实例变量
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.selectionStyle = .None
configure(cell, forRowAtIndexPath: indexPath)
return cell
}
var selectedIndexPath: NSIndexPath?
func configure(cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.textLabel!.text = "Row \(indexPath.row)"
if selectedIndexPath == indexPath {
// selected
cell.backgroundColor = UIColor.redColor()
}
else {
// not selected
cell.backgroundColor = UIColor.whiteColor()
}
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if selectedIndexPath == indexPath {
// selected same cell -> deselect all
selectedIndexPath = nil
}
else {
// select different cell
let oldSelectedIndexPath = selectedIndexPath
selectedIndexPath = indexPath
// refresh old cell to clear old selection indicators
var previousSelectedCell: UITableViewCell?
if let previousSelectedIndexPath = oldSelectedIndexPath {
if let previousSelectedCell = tableView.cellForRowAtIndexPath(previousSelectedIndexPath) {
configure(previousSelectedCell, forRowAtIndexPath: previousSelectedIndexPath)
}
}
}
let selectedCell = tableView.cellForRowAtIndexPath(indexPath)!
configure(selectedCell, forRowAtIndexPath: indexPath)
}
答案 1 :(得分:-1)
前一段时间我遇到了同样的问题,我做的是,我在CustomTableViewCell中添加了一个名为isset的新变量(Bool),当我第一次创建单元格时,我将其更改为true,所以之后我想重用一个已设置的单元格,我只是返回了arleady set one,而不是再次设置:
let cell = tableView.dequeueReusableCellWithIdentifier("Cellidentifier", forIndexPath: indexPath) as CustomTableViewCell
if cell.isset
{
return cell
}
//set your cell here
cell.isset = true
return cell