希望附件选中标记仅在右侧点击时显示

时间:2017-03-26 23:22:55

标签: ios uitableview

我有一个带有单元格的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)
    }

}

有没有一种简单的方法可以做到这一点,或者使用故事板来做到这一点?我的斯威夫特技能有很多不足之处。任何帮助,将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:3)

为什么不提供用户可以点击并且可以显示复选标记的实际按钮,而不是内置的复选标记附件类型?例如,该按钮可能会正常显示为空圆圈,当用户点击该按钮时,该按钮可能会显示为带有复选标记的圆圈。

否则,您希望用户猜测一个不起眼的界面,而这样,您可以在此处点击此处将任务标记为已完成。

示例:

enter image description here

为了实现这一点,我创建了一个按钮子类,并将每个单元格的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

对标记的引用