在table视图编辑模式下修改重新排序控件图标

Modify reorder control icon in table view editing mode

我想为 table 视图编辑模式中出现的汉堡包图标使用自定义颜色,甚至最好使用自定义图像。我在最初位于 Objective-C 的旧线程中找到了这个 Swift 代码片段(可在此处找到:Change default icon for moving cells in UITableView):

override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    if editing {
        for view in subviews as [UIView] {
            if view.dynamicType.description().rangeOfString("Reorder") != nil {
                for subview in view.subviews as [UIImageView] {
                    if subview.isKindOfClass(UIImageView) {
                        subview.image = UIImage(named: "yourimage.png")
                    }
                }
            }
        }
    }
}

为了适应我的 TableViewController,我将开始循环的行更改为: for view in tableView.subviews as [UIView] { 这似乎有效,但将找不到描述为 "Reorder" 的视图。这之后有没有改变?

我会在旧线程中询问,但由于声誉问题,我还没有被允许。

非常欢迎任何见解!

编辑:我可以通过将上面的代码更改为来更改图像:

override func setEditing(editing: Bool, animated: Bool) {
    super.setEditing(editing, animated: animated)

    if editing {
      for cell in tableView.visibleCells {
        for view in cell.subviews {
          if view.dynamicType.description().rangeOfString("Reorder") != nil {
            for subview in view.subviews as! [UIImageView] {
              if subview.isKindOfClass(UIImageView) {
                subview.image = UIImage(named: "yourimage.png")
                //subview.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
              }
            }
          }
        }
      }
   }
}

有一个错误,但是,当向下滚动时,并不是所有的图标都会改变。一些单元格仍将具有原始图标。我想这与重复使用的细胞有关。有什么解决办法吗?

编辑 2:我通过确保在 cellForRowAtIndexPath 方法中执行相同的图像替换逻辑来解决上述问题。另外,我正在检查图像是否已经更改,因为如果之前有图像,图像会有奇怪的偏移。

override func setEditing(editing: Bool, animated: Bool) {
  super.setEditing(editing, animated: animated)

  if editing {
    for cell in tableView.visibleCells {
      setEditingAccessoryView(forCell: cell)
    }
  }
}

func setEditingAccessoryView(forCell cell: UITableViewCell) {
  for view in cell.subviews {
    if view.dynamicType.description().rangeOfString("Reorder") != nil {
      for subview in view.subviews as! [UIImageView] {
        if subview.isKindOfClass(UIImageView) {
          if subview.image != UIImage(named: "yourImage.png") {
            subview.image = UIImage(named: "yourImage.png")
            //subview.frame = CGRect(x: 20, y: 20, width: 20, height: 20)
          }
        }
      }
    }
  }
}

在 cellForRowAtIndexPath 中:

if editing {
  setEditingAccessoryView(forCell: cell)
}

很高兴我们解决了您的问题。对于您的最后一个问题,我建议您在 cellForRowAtIndexPath: 中显式调用替换逻辑以在每次显示单元格时强制调用您的代码。

(顺便说一句,日志记录始终是解决令人费解的问题的好方法,)