didSelectRowAtIndexPath 不会在 ViewController 中触发

Posted

技术标签:

【中文标题】didSelectRowAtIndexPath 不会在 ViewController 中触发【英文标题】:didSelectRowAtIndexPath does not trigger in ViewController 【发布时间】:2013-09-30 00:25:17 【问题描述】:

所以,我在UIViewController 中添加了UITableViewControllerUITableViewCell,而cellForRowAtIndexPath 委托方法有效,didSelectRowAtIndexPath 无效。有人有什么想法吗?

编辑 2:UITableView 的委托设置为 UIViewController

编辑 3:我在另一个 Stack 问题 here 上找到了我的问题的答案。基本上我的[self view] 上有一个UITap...,它阻止了didSelectRow...。我不知道为什么 tap 会阻塞委托方法,我也不知道如何让 tap 和 table 同时工作。

编辑:让我烦恼的部分是我已经在早期的应用程序上得到了这个精确的设置。所以这意味着我在路上的某个地方错过了一步。问题是,我已经梳理了所有步骤,并将以前的应用程序与当前应用程序进行了比较,但我真的不知道我错过了什么。

我在两种委托方法中都添加了日志记录,当一个输出时,另一个不输出。

ViewController.h

#import "...TableViewCell.h"
...
    UITableViewDataSource,
    UITableViewDelegate
...

ViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"cellForRowAtIndexPath");
    ...
    return Cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    NSLog(@"didSelectRowAtIndexPath");

...TableViewCell.h(内容不重要)

...TableViewCell.m(内容不重要)

【问题讨论】:

由于调用了cellForRow... 方法,我们知道表的dataSource 已设置。您是否还设置了表格的delegate 属性?不设置didSelectRow...方法不会被调用。 嗨 rmaddy,是的,UITableView 委托属性设置为 UIViewController。 *编辑:我不小心说UITableViewController,但我的意思是说UIViewController 非常仔细地检查您的拼写是否正确,大小写是否正确。 嗨 Hot Licks,我只是仔细检查了一遍(永远无法确定),它的拼写完全正确,让我在这里复制/粘贴:- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 【参考方案1】:

我在another *** question找到了答案。

我将UITapGestureRecognizer 添加到[self view] 中,我将其注释掉,然后委托方法起作用了。

谁能告诉我为什么会这样,以及如何让UITapGestureRecognizerUITableView 在同一屏幕上工作?

// Hide keyboard when user taps outside of it
UITapGestureRecognizer *tapGestureRecognizer =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                            action:@selector(hideKeyboardOnTap)];
//[[self view] addGestureRecognizer:tapGestureRecognizer];
编辑:将UITapeGestureRecognizer 的错字更正为UITapGestureRecognizer

【讨论】:

呃,我想那是“UITapGestureRecognizer”。 (而且有点神秘。如果可能的话,最好的办法是将识别器添加到您不想以其他方式获取触摸的子视图中。)【参考方案2】:

您是否设置了tableView 的代表?

myTableView.delegate = self;

编辑:我的错,没有读取正在调用行的单元格。

您说您使用了自定义tableViewController。如果您已经覆盖了didSelectRowAtIndexPath 方法,那么在tableViewController 中调用[super didSelectRowAtIndexPath:] 可能很重要

编辑 2:还有一件事。我不知道这是什么原因,但我曾经在viewController 中遇到过同样的问题。我通过在相同的viewController 中添加didDeselectRowAtIndexPath 的空实现来解决它。尝试将其添加到表的 delegate 控制器中。

【讨论】:

还不错。一个来自dataSource,另一个来自delegate【参考方案3】:

回答“如何让 UITapGestureRecognizer 在与 UITableView 相同的屏幕上工作”的问题;

您应该“通知”您的 GestureRecognizer 其他识别器可以处理相同的手势:

你可以通过实现UIGestureRecognizerDelegate的方法来做到这一点

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

这是一个小例子……

@interface MyController : UIViewController<UIGestureRecognizerDelegate>  
 
  
@end  


-(void)viewDidLoad  
  
    UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self  action:@selector(actionOnTapGesture:)];  
    [gr setNumberOfTapsRequired:1];  
    [gr setDelegate:self];  
    [self.view addGestureRecognizer:gr];    
  

-(BOOL) gestureRecognizer:(UIGestureRecognizer *) gestureRecognizer shouldRecognizeSimultaneouslyGestureRecognizer:(UIGestureRecognizer *) otherGestureRecognizer  
  
    return YES;  

【讨论】:

【参考方案4】:

如果属性选择设置为“无选择”,请检查界面构建器。 根据您的需要将其更改为“单选”或其他选项。

这可能是 didSelect 没有被触发的原因。

【讨论】:

以上是关于didSelectRowAtIndexPath 不会在 ViewController 中触发的主要内容,如果未能解决你的问题,请参考以下文章

如果从 tableView:didSelectRowAtIndexPath 调用 UIWebView 不调用 loadRequest:

TableView didSelectRowAtIndexPath 不执行

textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用

tableView: didSelectRowAtIndexPath: 如果不设置下一个视图控制器的背景颜色看起来很糟糕

表视图的 iOS 问题:didSelectRowAtIndexPath 不触发窗口

didSelectRowAtIndexPath 没有被调用?