我对UITableView
委托函数didSelectRowAt
有疑问。一切正常,但不幸的是didSelectRowAt
没有被调用。我读了一些关于这个问题的其他stackoverflow问题,并尝试了一些解决方案,但它们都不适合我。我创建了tableview的子类,这是委托人本人:
class MyTableView : UITableView, UITableViewDelegate{
override func awakeFromNib() {
super.awakeFromNib()
separatorStyle = .none
backgroundView = nil
backgroundColor = UIColor.clear
isScrollEnabled = false
delegate = self
isEditing = false
allowsSelection = true
}
// func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
//
// this is working
//
// }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("not called")
}
}
因此MyTableView
的所有子类都将实现数据源的东西,这也很好(如果不知怎的话会提到这个)。
奇怪的是调用didHighlightRowAt
,所以委托以某种方式工作。只有我想要的didSelectRowAt
没有被调用。
顺便说一下,没有UITapGestureRecognizer
。
可以在某种程度上给我任何建议。是否存在错误的属性?
答案 0 :(得分:9)
请检查TableView's
cell allowedSelection。
tableView.allowsSelection = true
编辑:
tableView.allowsSelection
cell.selectionStyle
启用用户互动
答案 1 :(得分:4)
如果您为父视图分配了手势识别器,则需要执行以下操作:
self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: action)
if let tapGestureRecognizer = self.tapGestureRecognizer {
tapGestureRecognizer.cancelsTouchesInView = false
self.addGestureRecognizer(tapGestureRecognizer)
}
一旦您告诉手势识别器停止取消触摸,您的UITableView就开始像平常一样对点击做出反应
答案 2 :(得分:3)
答案 3 :(得分:1)
我不知道您尝试过的其他解决方案,但如果您使用的是自定义视单元,则可能是您在该组件上启用“启用用户交互”。
答案 4 :(得分:1)
如果您的ViewController
有UIGestureRecognizer
,则应禁用UIGestureRecognizer.cancelsTouchesInView
。例如:
extension UIViewController {
public func hideKeyboarOnTap() {
let tap = UITapGestureRecognizer(target: self, action: #selector(hideKeyboardAction))
tap.cancelsTouchesInView = false
self.view.addGestureRecognizer(tap)
}
@objc private func hideKeyboardAction() {
self.view.endEditing(true)
}
}
答案 5 :(得分:1)
我建议在您的代码上写成这样。
override func viewDidLoad() {
super.viewDidLoad()
tableview.delegate = self
}
答案 6 :(得分:0)
可能存在以下问题
1)您尚未设置UITableView的委托
Solution - `self.tableview.delegate = self`
2)检查UITableView或UITableViewCell的用户交互是否禁用
Solution: self.tableview.isUserInteractionEnabled = true
3)。检查tableview选择样式是否不是
Solution: self.tableview.allowsSelection = true
4)检查是否有任何手势未启用。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
答案 7 :(得分:0)
我同样遇到了一个问题,即使该委托已正确设置。在我的情况下,无法与表格视图进行交互,因为从用户的角度来看,它不是第一子视图。将其添加到主视图时,可以使用以下方法来确保将其显示在前面:
view.insertSubview(yourTableView, at: self.view.subviews.count)
或使用以下命令将其放在最前面:
self.view.bringSubview(toFront: yourTableView)
答案 8 :(得分:0)
我添加了一种在点击文本字段时隐藏键盘的机制:
...
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap(recognizer:)))
tapRecognizer.numberOfTapsRequired = 1
self.view.addGestureRecognizer(tapRecognizer)
}
@objc func handleSingleTap(recognizer: UITapGestureRecognizer) {
self.view.endEditing(true)
}
handleSingleTap
偷了事件。我删除了上面的所有内容,并改用了它:
override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
view.endEditing(true)
}
编辑又回来了!
答案 9 :(得分:0)
对我来说,一些视图相互阻碍,并且因为我将tableView:shouldHighlightRowAt:
设置为false
,所以我无法检测到问题
答案 10 :(得分:0)
目标C-可能的解决方案:
您只需要使用:
tap.cancelsTouchesInView =否;
代码:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(yourFunctionOnTap)];
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
tableView.allowsSelection = true
答案 11 :(得分:-1)
检查你的 didSelectRowAt
方法可能是你有错别字DeselectRowAtIndexPath
您可能不小心输入了 didDeselectRowAtIndexPath