-didSelectRowAtIndexPath:未被调用

ios uitableview cocoa-touch didselectrowatindexpath

198789 观看

30回复

159 作者的声誉

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

有没有人有任何想法,我可能搞砸了,以实现这一目标?

作者: Matt Pfefferle 的来源 发布者: 2008 年 11 月 1 日

回应 (30)


94

3458 作者的声誉

决定

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

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

作者: Hunter 发布者: 01.11.2008 07:00

65

4187 作者的声誉

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

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

  2. 您可能在行内有一个UIView作为第一响应者,并且可以消除您的点击。说一个UIButton或类似的东西。

作者: gilm 发布者: 01.11.2008 11:54

5

0 作者的声誉

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

作者: Lukasz 发布者: 23.04.2009 08:29

44

2552 作者的声誉

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

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

必须是return indexPath,否则-tableView:didSelectRowAtIndexPath:就不会被召唤。

作者: JackPearse 发布者: 26.10.2010 12:37

3

12193 作者的声誉

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

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

希望能帮助别人

作者: tbone 发布者: 25.05.2011 04:05

9

71 作者的声誉

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

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

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

作者: Steve 发布者: 02.07.2011 09:04

19

286 作者的声誉

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

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

作者: spiralstairs 发布者: 22.02.2012 02:50

10

16493 作者的声誉

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

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

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

作者: Andrew Gorcester 发布者: 06.03.2012 09:24

149

4125 作者的声誉

所有好的答案,但还有一个值得关注......

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

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

作者: Old McStopher 发布者: 05.05.2012 09:30

8

2068 作者的声誉

给我2美分。

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

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

作者: gmogames 发布者: 31.05.2012 12:36

8

2793 作者的声誉

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

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

作者: HotJard 发布者: 19.07.2012 12:28

534

1080 作者的声誉

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

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

作者: CGee 发布者: 25.09.2012 04:55

482

383 作者的声誉

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

UITableView选择类型

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

作者: Dennis Krut 发布者: 12.10.2012 09:05

286

1539 作者的声誉

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

我没有怀疑这个原因,因为表格细胞仍然会突出蓝色,好像水龙头正在通过。

作者: bugloaf 发布者: 02.11.2012 04:20

10

943 作者的声誉

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

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];
作者: Carlos 发布者: 21.02.2013 04:59

4

2824 作者的声誉

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

作者: juanignaciosl 发布者: 29.06.2013 07:56

28

209 作者的声誉

我遇到了一个问题,经过几个月不看我的代码后,我忘了我实现了以下方法,因为有些要求是不必要的

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

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

作者: cpt.neverm1nd 发布者: 23.07.2013 05:05

4

439 作者的声誉

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

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

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

作者: xytor 发布者: 27.07.2013 12:10

20

10750 作者的声誉

我已经UITapGestureRecognizer在我的表视图上放了一个键盘来解除阻止didSelectRowAtIndexPath:被调用的键盘。希望它可以帮助某人。

作者: Groot 发布者: 10.02.2014 07:48

19

876 作者的声誉

我有同样的问题,

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

当我评论与之相关的行时UITapGestureRecognizer,它可以工作。此外,您可以检查UITapGestureRecognizer selector轻敲的功能UITableViewCell

作者: Jeyhun Karimov 发布者: 10.06.2014 07:47

7

0 作者的声誉

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

作者: user486646 发布者: 25.07.2014 01:44

4

2861 作者的声誉

就我而言,我动态计算的高度TableViewSuperView在加载时间。由于计算错误,它TableView被定位在外面SuperView。在TableView绘制精细,但是所有交互被禁用(并且didSelectRowAtIndexPath从未被调用)。很难检测到,因为没有视觉指示TableView不能“访问”。

作者: GK100 发布者: 25.07.2014 03:33

88

36028 作者的声誉

如果问题出现,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
作者: Bartłomiej Semańczyk 发布者: 30.01.2015 09:22

5

1938 作者的声誉

确保你实现了tableView:didSelectRowAtIndexPath而不是tableView:didDeSelectRowAtIndexPath

这让我有好几次!

作者: SleepsOnNewspapers 发布者: 13.03.2015 07:18

11

3531 作者的声誉

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

作者: MB_iOSDeveloper 发布者: 28.09.2015 07:31

37

1573 作者的声誉

如果您在UITableView上添加了gestureRecognizer,didSelectRowAtIndexPath则不会被调用。

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}
作者: Vinu David Jose 发布者: 24.02.2016 08:19

5

584 作者的声誉

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

作者: yvetterowe 发布者: 28.06.2016 02:58

24

786 作者的声誉

你必须选择这些选项

在此输入图像描述

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

选择无选项,如下所示

在此输入图像描述

作者: Mohsin Qureshi 发布者: 25.07.2016 11:02

4

81 作者的声誉

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

iOS 9+

- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
作者: HonkyHonk 发布者: 14.03.2017 02:46

11

5193 作者的声誉

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

在此输入图像描述

作者: Naveed Ahmad 发布者: 06.09.2018 04:45
32x32