早上好
我的问题是,当我向下滚动向上时,我的表视图重用所选单元格.我的意思是当我从上向下选择一个单元格然后向下滚动时,我选择的一些单元格被选中,也有一些选中的单元格是当我再次向上滚动时没有显示选中,当发生这种情况时我再次选择苹果不仅仅是一个必须不被允许的单元格..我想提一下,我试图从’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
- }
解决方法
您当前将选择状态存储在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,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)
- }