didSelectRowAtIndexPath:未被调用

Gar*_*ett 57 iphone uitableview didselectrowatindexpath ios

我有一个UITableView作为我的子视图UIScrollVIew,这是我控制的主视图MainViewController.

在MainViewController.h中

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>

// other stuff here...

@property (weak, nonatomic) IBOutlet UITableView *myTableView;
Run Code Online (Sandbox Code Playgroud)

在MainViewController.m中

@synthesize myTableView;

// other stuff here...

- (void)viewDidLoad {
    myTableView.delegate = self;
    myTableView.datasource = self;
}

// other stuff here...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}
Run Code Online (Sandbox Code Playgroud)

我知道didSelectRowAtIndexPath没有被调用,因为我已经在方法本身和它内部的代码行上设置了断点,并且都没有被调用.我也知道数据源工作正常,因为我有其他功能可以在运行时修改单元格,并且它们工作正常.我使用最新的Xcode和iOS 5.0设置作为开发目标.我搜索并搜索了一个答案.有人有主意吗?

编辑: 我找到了答案.我UITapGestureRecognizer有一套myTableView的superView.这超出了选择呼叫.相信任何人都认为可能是它.在我将其标记为正确之前,您的答案已被删除.

编辑2: 很多人一直在评论这个,所以我会分享它.如果您遇到此问题,只需设置myGestureRecognizer.cancelsTouchInViewfalse,一切都应该正常工作.

Gar*_*ett 288

我找到了答案.我为myTableView的superView设置了UITapGestureRecognizer.这超出了选择呼叫.相信任何人都认为可能是它.在我将其标记为正确之前,您的答案已被删除.

cancelsTouchesInView属性设置为NO手势识别器,以允许表视图拦截事件.

  • 这对我来说是个问题,我的同事在一个接近根级别的视图中添加了一个UITapGestureRecognizer,这个视图正在吃掉我的点击事件.然而,误导性的是,表格单元格在敲击时仍会突出显示,因此我并不怀疑有任何事情正在拦截这些事件. (14认同)
  • 这对我来说也是个问题.确保检查手势识别器的cancelsTouchesInView属性.如果是,则它吃掉事件. (14认同)
  • 我今天遇到了同样的问题.我在代码中添加了UITapGestureRecognizer(当用户点击搜索字段之外时关闭键盘),这是吞下了水龙头.以下是如何识别这种情况:您的行突出显示,但是只有点击,按住,向左或向右滑动手指,然后释放(因为它不被识别为点击),didSelectRowAtIndexPath才会触发.简单的修复:tap.cancelsTouchesInView = NO; (9认同)

Kir*_*hav 12

针对Swift 3进行了更新:

如果您在代码中使用UITapGestureRecognizer: - #Swift 3 使用下面的代码行:

extension YourViewController{
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
        tap.cancelsTouchesInView = false
    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}
Run Code Online (Sandbox Code Playgroud)

如何调用: - 在ViewDidLoad()中

self.hideKeyboardWhenTappedAround()
Run Code Online (Sandbox Code Playgroud)


A. *_*cox 10

你的问题是区分大小写的.你的代码:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
Run Code Online (Sandbox Code Playgroud)

应该

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
Run Code Online (Sandbox Code Playgroud)


ris*_*shi 7

您是否为具有相同名称的tableview定义了实例变量.如果不是那么可能是这个问题 -

_myTableView.delegate = self;
_myTableView.datasource = self;
Run Code Online (Sandbox Code Playgroud)

要么-

self.myTableView.delegate = self;
self.myTableView.datasource = self;
Run Code Online (Sandbox Code Playgroud)

  • 真棒!搜索这个问题的长和宽,问题是我没有设置:self.tableView.delegate = self; (2认同)

Mun*_*ndi 7

也许这毕竟是一个错字.检查你的函数是不是didDeselectRowAtIndexPath:(选择,而不是选择).


Pei*_*hen 5

我的解决方案是:

  1. 设置cancelsTouchesInViewNo任何tapGesture

  2. 我发现在我的自定义单元格中, userInteractionEnable设置为 NO,只需删除userInteractionEnable = No并解决问题.