-didSelectRowAtIndexPath:未被调用

时间:2008-11-01 18:32:26

标签: ios uitableview cocoa-touch didselectrowatindexpath

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

有没有人有任何想法,我可能已经搞砸了这件事?

59 个答案:

答案 0 :(得分:533)

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

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

答案 1 :(得分:477)

可能导致问题的另一个问题不是选择选择类型:

UITableView selection kind

正常选择应为Single SelectionNo Selection

答案 2 :(得分:284)

另一种可能性是UITapGestureRecognizer可能正在吃这些事件,如下所示:https://stackoverflow.com/a/9248827/214070

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

答案 3 :(得分:149)

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

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

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

答案 4 :(得分:93)

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

您是否有机会将委托重置为其他课程?

答案 5 :(得分:83)

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

    故事板中的

enter image description here

使用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

答案 6 :(得分:63)

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

  1. 您可能忘记实施UITableViewDelegate协议,或者您的班级和表格视图之间没有授权插座。

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

答案 7 :(得分:44)

我遇到了同样的问题。而且很难找到。但在我的代码中的某个地方 是这样的:

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

必须为return indexPath,否则不会调用-tableView:didSelectRowAtIndexPath:

答案 8 :(得分:37)

如果您在UITableView上添加了gestureRecognizer,则不会调用 v1 <- c(1,0,0,1,1,1,0,1,1)

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

didSelectRowAtIndexPath

答案 9 :(得分:28)

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

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

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

答案 10 :(得分:24)

你必须选择这些选项

enter image description here

但如果您想在点击时未突出显示UITableView,则应在UITableViewCell属性中进行更改。

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

enter image description here

答案 11 :(得分:20)

我在表格视图上放了UITapGestureRecognizer来关闭阻止didSelectRowAtIndexPath:被调用的键盘。希望它可以帮到某人。

答案 12 :(得分:19)

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

通过这个问题:When editing, `UITableView` does not call didSelectRowAtIndexPath ??

答案 13 :(得分:19)

我遇到了同样的问题,

原因是使用UITapGestureRecognizer。当我在其他任何地方拍摄时,我希望键盘能够解散。我意识到这会覆盖所有点击操作,这就是为什么didSelectRowAtIndexPath函数没有调用。

当我评论与UITapGestureRecognizer相关的行时,它会起作用。此外,如果点按的是UITapGestureRecognizer selector,您可以检查UITableViewCell的功能。

答案 14 :(得分:11)

对于Xcode 6.4,Swift 1.2。选择&#34;标签&#34;在IB中已经改变了。我不知道如何以及为什么。将其设置为&#34;单一选择&#34;使我的表视图细胞再次可选。 enter image description here

答案 15 :(得分:11)

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

enter image description here

答案 16 :(得分:10)

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

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

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

答案 17 :(得分:10)

请记住在viewDidLoad方法中设置数据源和委托,如下所示:

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];

答案 18 :(得分:9)

我的问题不是上述问题。太蹩脚了。但我想我会把它列在这里,以防它帮助某人。

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

我知道。不要笑。但也许这会在我失去的那个时刻拯救某人...

答案 19 :(得分:8)

如果你读到这个,那么仍然无法解决问题。

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

答案 20 :(得分:8)

给我2美分。

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

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

答案 21 :(得分:7)

我刚刚拥有这个并且过去发生在我身上的事情没有用,因为我在尝试添加方法时没有注意自动完成功能,而实际上我最终实现了tableView:didDeselectRowAtIndexPathtableView:didSelectRowAtIndexPath:

答案 22 :(得分:5)

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

答案 23 :(得分:5)

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

答案 24 :(得分:4)

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

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

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

答案 25 :(得分:4)

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

iOS 9 +

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

答案 26 :(得分:4)

你可能做的另一个错误(正如我所做的):如果你在单元格中设置了一个segue,则不会调用didSelectRowAtIndexPath。您应该在视图控制器中设置segue。

答案 27 :(得分:4)

在我的情况下,我会在加载时动态计算TableView&#39; SuperView的高度。由于计算错误,TableView位于SuperView之外。 TableView被绘制得很好,但所有互动都被禁用(并且didSelectRowAtIndexPath从未被调用过)。很难检测到,因为没有视觉指示TableView不可以访问&#34;。

答案 28 :(得分:4)

确保您已实施tableView:didSelectRowAtIndexPath而非tableView:didDeSelectRowAtIndexPath

这让我有好几次!!

答案 29 :(得分:3)

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

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

希望能帮到某人

答案 30 :(得分:3)

请检查UITapGestureRecognizer。 在我的情况下,为摆放tableview的视图添加了tapgesture,这像UIDidselect一样吃了UITableview的用户交互。 禁用视图的手势后,将触发didselect委托。

答案 31 :(得分:3)

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

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

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

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

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

Debug View Hierarchy

答案 32 :(得分:3)

关注故事板中的UITableView属性,我的案例中发生的事情是我将故事板中的combox选为“Selection:Single Selection”,这不允许方法{{1}跑。

答案 33 :(得分:2)

在我的情况下,只有一个单元格出现此问题。单元格包括只读模式的UITextView插座。虽然在点击之前它是只读的。点击后,键盘上升。事实证明它仍然需要禁用交互。

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

[cell.content resignFirstResponder];

答案 34 :(得分:2)

这可能只是在我的情况下,但我从备份中重新加载了一些文件,但事情没有用,包括这个。完成清洁(产品&gt;清洁或Shift + Command + K)后,它工作正常。可能在预编译的头文件中搞砸了一些东西。这可能不是你的问题,但值得一试。

答案 35 :(得分:2)

tableView?.allowsSelection = true

在Xcode 11.7中默认为False

答案 36 :(得分:2)

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

答案 37 :(得分:2)

检查-heightForRowAtIndexPath是否不返回0.

答案 38 :(得分:2)

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

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

如果你回来&#34;否&#34; didSelectRow不会被称为

答案 39 :(得分:2)

在我的情况下问题是我有一个UITableViewCell子类,我实现了这两个方法: touchesBegan:withEvent:&amp; 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
}

答案 40 :(得分:2)

如果正在点击您单击的单元格但仍未调用该功能,请仔细检查您的功能签名。它应该是这样的:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)

答案 41 :(得分:1)

我刚刚遇到这个问题,但它没有立即发生;选择几个单元格后,他们将停止调用didSelectItemAtIndexPath。我意识到问题是集合视图allowsMultipleSelection设置为TRUE。由于单元格从未被取消选择,因此调用didSelectItemAtIndexPath将停止将来的调用。

答案 42 :(得分:1)

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

- (float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
像往常一样。

但是,我对编译器警告的看法并不够......它说我应该将上面的行改为:

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

64位兼容性! 握拳

请注意,以防你开始拔头发。

答案 43 :(得分:1)

我自己有这个问题。我在IB中构建了视图的骨骼(只是一个View和一个TableView),并且没有设置委托。我将它连接到File的所有者,它就像一个魅力。 ::保存::

答案 44 :(得分:1)

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

答案 45 :(得分:1)

我调用了一些自定义表代码中的cell.userInteractionEnabled。

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

答案 46 :(得分:1)

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

>>> t('improved_i_sqrt(r(20000))', 'from __main__ import *', number = 5)/5.
0.10908999762373242
>>> all(improved_i_sqrt(n) == i_sqrt(n) for n in xrange(10**6))
True

答案 47 :(得分:1)

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

我正在使用ios8中引入的称为自调整单元格的功能。我偶然发现了blog post指出:

  

首次显示表格视图时,您可能会找到一些单元格   尺寸不合适。但是当你滚动表视图时,新的   单元格显示正确的行高。要解决此问题,   您可以在视图出现后强制重新加载:

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

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

答案 48 :(得分:0)

  1. 添加@interface ExampleViewController () <UITableViewDelegate, UITableViewDataSource>

  2. 在故事板中进行委派

  3. enter image description here

    1. 添加代码

      - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
          UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
         NSString *cellText = cell.textLabel.text;
      }
      

答案 49 :(得分: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 }
}

答案 50 :(得分:0)

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

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

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    [tableView reloadData];
}];

答案 51 :(得分:0)

我遇到的问题是在应用断点后控制没有进入选择行。问题在于考虑。我从视图中删除了标签手势。然后它工作正常

答案 52 :(得分:0)

在我的情况下,我做了一个小错误,我指定了:

tableView.isUserInteractionEnabled = false

它应该是:

tableView.isUserInteractionEnabled = true

答案 53 :(得分:0)

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

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

这将继续编译而没有投诉,但你永远不会被ui行动调用。

“这是我的两分钱,我会想要我的改变”

答案 54 :(得分:0)

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

这不起作用:

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

这有效:

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

答案 55 :(得分:0)

我已阅读所有答案,并完全同意。但这与我的情况完全不同。我的segue有一个新的detailViewController,它直接链接到StoryBoard中的tableCell上,从而导致了问题。因此,我不得不从单元格中删除该序列并将其与UITableViewController本身联系起来。现在,通过编写以下代码,它可以工作,

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

希望此解决方案可以帮助某个人!

答案 56 :(得分:0)

您必须检查此 选择必须是单项选择,编辑期间不得选择任何内容 并且您还更改了uttableviewcell属性中的设置 您在表格视图单元格中进行编辑 样式必须为自定义,标识符必须为Rid 和部分没有

答案 57 :(得分:0)

我无法评论,写在这里。 在我的情况下,didSelectRow有效,但不是didDeselectRow。 我为delegate设置了dataSourcetableView,这解决了我的问题。

答案 58 :(得分:0)

当我的 class nameTableViewControllerInterface Builder 中设置不正确时,我遇到了这个问题。