我想创建一个消息传递应用程序,因此我想允许用户选择消息。
问题在于我无法找到一种方法来制作单元格,只有在特定视图中轻触单元格才会选中单元格
我的源代码:
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
let cell = tableView.cellForRow(at: indexPath) as! BubbleCell
if (cell.messageBubble.wasClicked){ //? somehow
return indexPath
} else {
return nil
}
}
就像在信使中一样。
如果单击空白区域,则单元格将不会被选中,但如果在消息气泡上(单元格内部有一个视图)则会被选中。
答案 0 :(得分:2)
如果我们假装消息气泡是一个按钮,最容易看到如何做到这一点。如果它不是按钮,您可以给它一个轻击手势识别器并获得相同的效果。
首先,使用委托方法来抑制用户点击单元格以选择它的正常能力:
func tableView(_ tableView: UITableView,
willSelectRowAt indexPath: IndexPath) -> IndexPath? {
return nil
}
其次,我们给按钮(或点击手势识别器)一个动作功能。当它触发时,找出按钮所在的单元格并在代码中选择它:
@IBAction func buttonPressed (_ sender:AnyObject) {
let cell = (sender as! UIView).superview!.superview! as! UITableViewCell
let row = self.tableView.indexPath(for: cell)!
self.tableView.selectRow(at: row, animated: true, scrollPosition: .none)
}
在该示例中,我碰巧知道按钮直接位于单元格的内容视图中,因此它是视图层次结构的两个步骤以到达单元格。当然,您可能需要进行调整。
此截屏视频显示结果:尝试单击整个单元格无效,但单击“按钮”区域可选择单元格。
这种方法有效的原因是,当我们在代码中选择行时,我们的willSelectRowAt
不被调用 - 仅当用户点击单元格时。
答案 1 :(得分:1)
您可以移除willSelectRowAt
方法,并在单元格中添加按钮(或使用UITapGestureRecognizer的视图)。