' didSelectRowAt'没有被召唤

时间:2017-07-07 08:00:36

标签: ios swift uitableview swift3

我对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

可以在某种程度上给我任何建议。是否存在错误的属性?

12 个答案:

答案 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)

对我来说,改变选择样式可以解决所有问题。

storyboard

答案 3 :(得分:1)

我不知道您尝试过的其他解决方案,但如果您使用的是自定义视单元,则可能是您在该组件上启用“启用用户交互”

答案 4 :(得分:1)

如果您的ViewControllerUIGestureRecognizer,则应禁用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-可能的解决方案:

  1. 您只需要使用:

    tap.cancelsTouchesInView =否;

代码:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                           initWithTarget:self
                           action:@selector(yourFunctionOnTap)];
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
  1. 设置tableview的允许选择属性

tableView.allowsSelection = true

答案 11 :(得分:-1)

检查你的 didSelectRowAt 方法可能是你有错别字DeselectRowAtIndexPath

您可能不小心输入了 didDeselectRowAtIndexPath