我有一个带有单元格的TableView,当单元格中的任何位置按下时,它会在右侧添加一个复选标记。我只想在右侧点击单元格时显示复选标记。这是TableViewController的相关代码部分:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell
let task = tasks[indexPath.row]
cell.task = task
if task.completed {
cell.accessoryType = UITableViewCellAccessoryType.checkmark;
} else {
cell.accessoryType = UITableViewCellAccessoryType.none;
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
var tappedItem = tasks[indexPath.row] as Task
tappedItem.completed = !tappedItem.completed
tasks[indexPath.row] = tappedItem
tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.none)
}
}
有没有一种简单的方法可以做到这一点,或者使用故事板来做到这一点?我的斯威夫特技能有很多不足之处。任何帮助,将不胜感激!谢谢!
答案 0 :(得分:3)
为什么不提供用户可以点击并且可以显示复选标记的实际按钮,而不是内置的复选标记附件类型?例如,该按钮可能会正常显示为空圆圈,当用户点击该按钮时,该按钮可能会显示为带有复选标记的圆圈。
否则,您希望用户猜测一个不起眼的界面,而这样,您可以在此处点击此处将任务标记为已完成。
示例:
为了实现这一点,我创建了一个按钮子类,并将每个单元格的accessoryView
设置为它的一个实例:
class CheckButton : UIButton {
convenience init() {
self.init(frame:CGRect.init(x: 0, y: 0, width: 20, height: 20))
self.layer.borderWidth = 2
self.layer.cornerRadius = 10
self.titleLabel?.font = UIFont(name:"Georgia", size:10)
self.setTitleColor(.black, for: .normal)
self.check(false)
}
func check(_ yn:Bool) {
self.setTitle(yn ? "✔" : "", for: .normal)
}
override init(frame:CGRect) {
super.init(frame:frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
按钮的标题可以是空字符串或复选标记字符,从而提供点击按钮时看到的效果。此代码来自cellForRowAt:
:
if cell.accessoryView == nil {
let cb = CheckButton()
cb.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
cell.accessoryView = cb
}
let cb = cell.accessoryView as! CheckButton
cb.check(self.rowChecked[indexPath.row])
(其中rowChecked
是一个Bool数组。)
答案 1 :(得分:1)
您必须定义自己的配件按钮,并处理自己的点击。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell
let task = tasks[indexPath.row]
cell.task = task
let checkButton = UIButtonSubclass()
...configure button with your circle and check images and a 'selected property'...
checkButton.addTarget(self, action:#selector(buttonTapped(_:forEvent:)), for: .touchUpInside)
cell.accessoryView = checkButton
checkButton.selected = task.completed //... this should toggle its state...
return cell
}
func buttonTapped(_ target:UIButton, forEvent event: UIEvent) {
guard let touch = event.allTouches?.first else { return }
let point = touch.location(in: self.tableview)
let indexPath = self.tableview.indexPathForRow(at: point)
if let task = tasks[indexPath.row] {
task.completed = !task.completed
}
tableView.reloadData() //could also just reload the row you tapped
}
但是,已经注意到,如果您开始删除行,使用标记来检测哪个行被点击是危险的。您可以在此处阅读更多内容https://stackoverflow.com/a/9274863/1189470
<强> EDITTED 强> 删除了@matt
对标记的引用