304

我正在编写一个在选项卡视图中带有表格视图的 iOS 应用程序。在我的UITableViewController, 我实现-tableView:didSelectRowAtIndexPath:了 ,但是当我在运行时选择一行时,没有调用该方法。不过,表格视图正在被填充,所以我知道我的控制器中的其他 tableView 方法正在被调用。

有谁知道我可能搞砸了什么来实现这一点?

4

59 回答 59

534

以防万一有人犯了和我一样的愚蠢错误:

检查您期望的方法名称是否didSelect可能以某种方式意外获得didDeselect。我花了大约两个小时才发现...

于 2012-09-25T16:55:11.947 回答
516

可能导致问题的另一件事是未选择选择类型:

UITableView 选择种类

应该是Single Selection正常选择,应该No Selection

要以编程方式执行此操作,请执行以下操作:

tableView.allowsSelection = YES
于 2012-10-12T09:05:34.480 回答
302

另一种可能性是 UITapGestureRecognizer 可能正在吃掉这些事件,就像这里的情况一样:https ://stackoverflow.com/a/9248827/214070

我没有怀疑这个原因,因为表格单元格仍然会突出显示蓝色,就好像水龙头正在通过一样。

于 2012-11-02T16:20:01.050 回答
151

所有的好答案,但还有一个要注意...

(特别是在以编程方式创建 UITableView 时)

[tableView setAllowsSelection:YES];确保 tableView 可以通过设置或删除任何将其设置为 的行来响应选择NO

于 2012-05-05T21:30:56.280 回答
98

听起来该类可能不是该UITableViewDelegate表视图的,尽管UITableViewController应该自动设置。

您有没有机会将代表重置为其他班级?

于 2008-11-01T19:00:09.487 回答
94

如果出现问题,UITapGestureRecognizer您可以解决此问题:

  • 在故事板中:

在此处输入图像描述

在代码中Objective-C

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap];

[tap setCancelsTouchesInView:NO];

在代码中Swift

let tap = UITapGestureRecognizer(target: self, action:Selector("dismissKeyboard"))
view.addGestureRecognizer(tap)

tap.cancelsTouchesInView = false
于 2015-01-30T09:22:40.883 回答
68

在这种情况下,我遇到了两件事。

  1. 您可能忘记实现 UITableViewDelegate 协议,或者您的类和表视图之间没有委托出口。

  2. 您的行内可能有一个 UIView ,它是第一响应者,并会带走您的点击。说一个 UIButton 或类似的东西。

于 2008-11-01T23:54:02.500 回答
45

我曾经也有过一样的问题。而且很难找到。但在我的代码中某处是这样的:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    return nil;
}

它必须是return indexPath,否则-tableView:didSelectRowAtIndexPath:不会被调用。

于 2010-10-26T12:37:12.307 回答
39

如果你在 UITableView 上添加了一个gestureRecognizer,didSelectRowAtIndexPath将不会被调用。

因此,您需要使用gestureRecognizer 委托方法来避免在特定视图中触摸。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}
于 2016-02-24T08:19:09.557 回答
30

我遇到了一个问题,几个月不看我的代码后,我忘记了由于一些不必要的要求而实现了以下方法

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath  *)indexPath{
    return NO;
}

它应该为一行返回 YES 以使其被选中。

于 2013-07-23T05:05:47.217 回答
24

您必须选择这些选项

在此处输入图像描述

但是如果你想UITableView在点击时不突出显示,那么你应该在UITableViewCell属性中进行更改。

为选择选择无选项,如下所示

在此处输入图像描述

于 2016-07-25T11:02:22.013 回答
21

我在我的桌面视图上放了一个UITapGestureRecognizer以关闭阻止didSelectRowAtIndexPath:被调用的键盘。希望它可以帮助某人。

于 2014-02-10T19:48:29.980 回答
19

如果您遇到和我一样的问题:显然,如果您的 tableView 处于编辑模式,则不会调用此方法。您必须将allowSelectionDuringEditing 设置为true。

通过这个问题:编辑时,`UITableView` 不调用 didSelectRowAtIndexPath ??

于 2012-02-22T02:50:32.560 回答
19

我有同样的问题,

原因是使用UITapGestureRecognizer. 当我点击其他任何地方时,我希望键盘关闭。我意识到这会覆盖所有点击动作,这就是为什么didSelectRowAtIndexPath没有调用函数。

当我评论与 相关的行时UITapGestureRecognizer,它可以工作。此外,您可以检查UITapGestureRecognizer selector是否被点击的功能UITableViewCell

于 2014-06-10T07:47:01.710 回答
15

在我的情况下,没有调用 didSelctRowAtIndexPath 是因为我在 tableView 的Selection属性中选择了none ,设置为单选解决了我的问题

在此处输入图像描述

于 2018-09-06T16:45:53.137 回答
11

对于 Xcode 6.4,Swift 1.2。选择“标签”已在 IB 中更改。我不知道如何以及为什么。将其设置为“单选”使我的表格视图单元格再次可选择。 在此处输入图像描述

于 2015-09-28T07:31:56.163 回答
10

即使另一个答案已被接受,我也会为观察此问题的人添加一个可能的问题和解决方案:

如果您打开了自动引用计数 (ARC),您可能会发现即使将控制器指定为视图的委托后,由于 ARC 正在删除控制器,因此不会收到视图发送给控制器的消息。显然 UITableView 的委托指针不算作 ARC 的引用,所以如果这是对它的唯一引用,控制器将被释放。您可以通过在控制器上实现 dealloc 方法并在那里设置断点或 NSLog 调用来验证这是否发生。

解决方案是在其他地方使用强引用来跟踪控制器,直到您确定不再需要它为止。

于 2012-03-06T21:24:19.413 回答
10

记得在 viewDidLoad 方法中设置 datasource 和 delegate 如下:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];
于 2013-02-21T16:59:19.040 回答
9

我的问题不是以上任何一个。而且很蹩脚。但我想我会在这里列出它以防它帮助某人。

我有一个tableViewController是我的“基本”控制器,然后我创建了这个控制器的子类。我tableView:didSelectRowAtIndexPath在“基”类的例程中编写了所有代码。完全忘记了默认情况下,这个例程也在我的所有子类中创建(尽管没有代码做任何事情)。所以当我运行我的应用程序时,它运行了代码的子类版本,什么也没做,这让我很伤心。因此,当然,一旦我从子类中删除了该例程,它就使用了 mt“基”类例程,并且我在做生意。

我知道。不要笑。但也许这会节省我失去的时间......

于 2011-07-02T21:04:35.210 回答
9

给我2美分。

我有一个自定义 UITableViewCell 并且有一个按钮覆盖整个单元格,所以当触摸发生时,按钮被选中而不是单元格。

要么删除按钮,要么在我的情况下,我将按钮上的 User Interation Enable 设置为 false,这样单元格就是被选中的单元格。

于 2012-05-31T00:36:25.453 回答
8

如果您阅读此内容,那么仍然无法解决问题。

我有自定义单元格,其中复选框“启用用户交互”被禁用。所以,我只是打开它。祝你好运。

于 2012-07-19T12:28:39.820 回答
7

我刚刚有了这个,就像过去发生在我身上的那样,它没有用,因为我在尝试添加方法时没有注意自动完成功能,实际上我最终实现了tableView:didDeselectRowAtIndexPath: 而不是tableView:didSelectRowAtIndexPath:.

于 2014-07-25T01:44:35.927 回答
7

确保您实施tableView:didSelectRowAtIndexPath而不是tableView:didDeSelectRowAtIndexPath

这让我不止几次!

于 2015-03-13T07:18:17.847 回答
6

请检查 UITapGestureRecognizer。在我的情况下,为放置 tableview 的视图添加了 tapgesture,它正在像 didselect 一样吃掉 UITableview 的用户交互。在为视图禁用 Tapgesture 后,触发了 didselect 委托。

于 2019-08-08T12:48:41.930 回答
5

如果您的表格视图处于编辑模式(例如[tableView setEditing:YES animated:NO];),您需要设置tableView.allowsSelectionDuringEditing = YES;

于 2016-06-28T02:58:51.710 回答
5

在我的情况下,解决方案是在下面的函数中将 NO 更改为 YES。

iOS 9+

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
于 2017-03-14T14:46:38.657 回答
5

检查您viewController是否有以下方法:

- (BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

如果您返回“NO”,则不会调用 didSelectRow

于 2018-02-22T17:44:43.607 回答
4

我知道是旧的并且问题已解决,但是有类似的问题,我认为问题出在我的自定义 UITableViewCell 上,但解决方案完全不同 - 我重新启动 XCode :) 然后工作正常!几乎像 Windows :)

于 2009-04-23T20:29:32.267 回答
4

您可能会犯的另一个错误(就像我一样):如果您在单元格上设置了一个 segue,didSelectRowAtIndexPath则不会调用。你应该在视图控制器上设置你的 segues。

于 2013-06-29T07:56:38.390 回答
4

这些答案都不适合我。大约一个小时后,我发现了一些非常阴险的东西:

我在另一个表格视图的单元格中有一个表格视图。我决定制作一个包含内部表格视图的封闭视图。我将此视图称为 contentView 并将其连接到 xib 中。

原来 UITableViewCell 已经有一个 contentView 并用它做了一些奇怪的事情。当我将属性重命名为 mainContentView 并将视图重新连接到此重命名的属性时,问题自行解决。

于 2013-07-27T00:10:39.630 回答
4

注意UITableView情节提要中的属性,在我的情况下发生的事情是我将情节提要中的组合框选为“选择:单选”,这不允许该方法didSelectRowAtIndexPath运行。

于 2014-06-04T04:40:31.887 回答
4

就我而言,我在加载时动态计算TableView's的高度。SuperView由于计算错误,TableView被定位在SuperView. 画得TableView很好,但是所有交互都被禁用(并且didSelectRowAtIndexPath从未被调用)。很难检测到,因为没有视觉指示表明TableView“不可访问”。

于 2014-07-25T03:33:58.953 回答
4

就我而言,问题是我有一个UITableViewCell子类,并且我实现了这两种方法: touchesBegan:withEvent:&touchesEnded:withEvent来处理精美的触摸动画。但我忘记添加[super touchesBegan:touches withEvent:event];方法广告[super touchesEnded:touches withEvent:event];也通知触摸的单元格的父级。

所以将代码更改为以下解决了我的问题:

-(void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event{
    [super touchesBegan:touches withEvent:event];
    //blah blah blah
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [super touchesEnded:touches withEvent:event];
    //rest of the code
}
于 2015-10-18T20:22:23.583 回答
3

好的,我刚遇到这个问题,在这里更新,我的问题与这里发现的略有不同。

我查看了 IB 并看到我的委托 WAS 已设置,但它被错误地设置为 VIEW 而不是 File's Owner(右键单击表视图以查看委托指向的位置)。

希望对某人有所帮助

于 2011-05-25T16:05:14.647 回答
3

这篇文章中有一些惊人的线索和答案(也许是我见过的最好的讨论之一!)这里的线索帮助我弄清楚我的问题是什么,但我仍然花了很多时间在键盘上流口水试图发现问题,与其他帖子类似。但是,我最终发现它的方式有点不同,所以我想分享一下,以防其他人也遇到它。

原来我的问题是,在代码中,一个超类添加了一个全屏“错误视图”,它不是隐藏的,而是透明的。但是,因为它在 tableview 上并且“用户操作”设置为 YES,所以它拦截了我对 tableview 的触摸。

我使用 Xcode 很酷的“Debug View Hierarchy”按钮对此进行了诊断。这是一个带有注释的屏幕截图,希望能解释我做了什么以及我最终如何诊断出这个问题。

在代码中,我只需要这样做:

errorMessageView.setUserInteractionEnabled = NO;
// or
errorMessageView.hidden = YES;

调试视图层次结构

于 2016-03-09T16:16:29.383 回答
3
tableView?.allowsSelection = true

在 Xcode 11.7 中默认为 False

于 2020-09-07T20:01:21.447 回答
2

这可能只是在我的情况下,但我已经从备份中重新加载了一些文件并且事情没有工作,包括这个。进行完全清洁(产品 > 清洁或 Shift + Command + K)后,它起作用了。可能在预编译的标头中有些东西搞砸了。这对你来说可能不是问题,但值得一试。

于 2013-06-13T15:00:26.973 回答
2

如果您有自定义单元格,请记住在单元格的 Xib(或通过代码)中设置 UserInteractionEnabled。

于 2014-02-11T16:32:27.003 回答
2

检查 -heightForRowAtIndexPath 是否不返回 0。

于 2014-03-17T09:50:00.137 回答
2

就我而言,只有一个细胞有这个问题。该单元格包括处于只读模式的 UITextView 插座。虽然在点击之前它是只读的。敲击后,键盘升起。事实证明,它仍然需要禁用交互。

cell.content.scrollEnabled = NO;
cell.content.editable = NO;
cell.content.userInteractionEnabled = NO;
cell.content.delegate = nil;

[cell.content resignFirstResponder];

于 2014-08-26T21:55:26.707 回答
2

我间歇性地遇到这个问题。有时触摸一个单元格会导致它被选中。有时它不会收到触摸事件。

我正在使用 ios8 中引入的称为自调整单元格的功能。我看到这篇博客文章指出:

首次显示表格视图时,您可能会发现某些单元格的大小不正确。但是当您滚动表格视图时,新单元格将以正确的行高显示。要解决此问题,您可以在视图出现后强制重新加载:

override func viewDidAppear(animated: Bool) {
    tableView.reloadData()
}

这为我解决了这个问题。即使表格视图正确呈现,触摸处理(特别是 UITableView 的 hitTest)似乎也受到上述错误的影响。

于 2015-03-20T05:25:32.780 回答
2

我迭代了所有以前的答案,但没有一个对我有帮助。经过反复试验,我找到了不同的解决方案。我有一个 UIImageView 覆盖整个单元格(作为背景)。默认情况下 UIImageView 禁用用户交互。通过启用 imageviews 用户交互委托方法 -didSelectRowAtIndexPath: 再次被调用。例如。

cell.imgView.userInteractionEnabled = YES;
于 2015-07-04T19:36:45.520 回答
2

如果您单击的单元格被突出显示但该函数仍未被调用,请仔细检查您的函数签名。它应该如下所示:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
于 2017-08-16T07:20:11.157 回答
1

我自己也有这个问题。我已经在 IB 中构建了视图的骨架(只是一个视图和一个 TableView),并且没有设置委托。我将它连接到 File's Owner,它就像一个魅力。::节省::

于 2010-10-14T02:08:36.097 回答
1

另一个可能的原因似乎UITableView是嵌入在UIScrollView. 我今天遇到了这个问题,因为我无意中将滚动视图而不是普通视图作为控制器的根视图。

于 2013-07-24T17:25:32.857 回答
1

我在一些定制的表格代码中调用了 cell.userInteractionEnabled。

愚蠢,但不是大多数错误吗?

于 2013-10-31T17:06:24.993 回答
1

另一个疯狂的可能性:我在 iPhone 5S 上运行我的应用程序,我使用了:

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

就像我过去一样。

但是,我没有仔细查看我的编译器警告......它说我应该将上面的行更改为:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

64位兼容性! 握拳

要小心,以防你开始拔头发。

于 2014-04-06T09:48:03.310 回答
1

我刚刚遇到了这个问题,但是它并没有立即发生;选择几个单元格后,他们将停止调用didSelectItemAtIndexPath。我意识到问题在于集合视图已allowsMultipleSelection设置为 TRUE。因为单元格永远不会被取消选择,所以这阻止了未来的调用调用didSelectItemAtIndexPath

于 2014-12-10T17:12:05.967 回答
1

我已阅读所有答案并强烈同意。但在我的情况下完全不同。我有新seguedetailViewController直接链接到我tableCell在 StoryBoard 中的链接,这导致了这种情况。所以我不得不从我的单元格中删除那个segue并将它与它UITableViewController本身联系起来。现在通过编写以下代码它可以工作,

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        // Do any operation
        performSegue(withIdentifier: "DetailSegue", sender: self)
    }

希望这个解决方案能帮助那里的人!

于 2019-03-16T06:11:44.277 回答
0

我遇到了问题,即在应用断点后控件没有进入 didselect 行。问题就在眼前。我从视图中删除了标签手势。然后它工作正常

于 2013-04-02T10:19:04.220 回答
0

我不能评论,写在这里。在我的情况下didSelectRow工作,但不是didDeselectRow。我设置了delegate,这解决了我的情况。dataSourcetableView

于 2014-08-26T09:20:23.643 回答
0
  1. 添加@interface ExampleViewController () <UITableViewDelegate, UITableViewDataSource>

  2. 在情节提要中进行委托

在此处输入图像描述

  1. 添加代码

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
       NSString *cellText = cell.textLabel.text;
    }
    
于 2016-11-15T11:10:18.520 回答
0

我不确定是否有人滚动到足以看到这个答案,但由于这是关于这个主题的最流行的问题并且答案不存在我会添加它:

从 Xcode 9 / Swift 4 开始,所有 Objective-C 方法都应该标记为@objc. 编译器在识别应该应用它的地方做了合理的工作,但是它没有弄清楚继承。例如:

class Delegate: NSObject, UITableViewDelegate {
}

class SuperDelegate: Delegate {
    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { return indexPath }
}

这不会产生任何警告、崩溃或构建错误。但是,在您添加之前不会调用您的线路@objc

@objc class SuperDelegate: Delegate {
    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? { return indexPath }
}
于 2017-11-07T22:51:41.393 回答
0

确保调用reloadData主线程。如果您从某种异步方法(例如:某种网络请求)调用该方法,表格视图可能会或可能不会正确响应(在某些情况下应用程序甚至可能崩溃)。

reloadData如果调用是在其他方法块(您不确定)中进行的,请使用主线程代码块来执行调用:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [tableView reloadData];
}];
于 2018-01-03T17:58:17.677 回答
0

在我的情况下,我犯了一个小错误,我分配了:

tableView.isUserInteractionEnabled = false

它应该是:

tableView.isUserInteractionEnabled = true
于 2018-03-28T08:41:10.787 回答
0

我刚刚找到了另一种调用您的didSelect方法的方法。在某些时候,在 func 声明本身出现一些错误时,XCode 建议我将 @nonobjc 添加到我的方法中:

@nonobjc func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

这将继续编译而不会抱怨,但您永远不会被 ui 操作调用。

“那是我的两分钱,我想要我的零钱回来”

于 2018-06-16T17:14:04.137 回答
0

就我而言,问题在于将该方法声明为私有方法。

这没有用:

private func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

这有效:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
于 2018-12-26T18:47:19.017 回答
0

您必须检查此选择必须是单选并且编辑在编辑期间必须没有选择并且您更改 uttableviewcell 属性中的设置并且您在表格视图中编辑的单元格样式必须是自定义的并且标识符必须是 Rid 并且部分是无

于 2019-03-16T06:18:44.590 回答
0

我遇到了这个问题,当class nameTableViewControllerInterface Builder.

于 2021-02-07T19:50:14.777 回答