当前位置:  开发笔记 > 编程语言 > 正文

-didSelectRowAtIndexPath:未被调用

如何解决《-didSelectRowAtIndexPath:未被调用》经验,为你挑选了25个好方法。

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

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



1> CGee..:

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

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


同样的问题在这里 这是因为XCode在选择之前自动完成取消选择.

2> Dennis Krut..:

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

UITableView选择类型

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


我一直在努力,因为我的场景总是处于编辑模式,我一直忘记更改"编辑时没有选择"的默认设置.
您可以在viewControlller NSParameterAssert(self.tableView.allowsSelection)的-viewDidLoad方法中添加此行;

3> bugloaf..:

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

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


我遇到的问题与@ coolcool1994刚刚实现[tap setCancelsTouchesInView:NO]; 并解决了这个问题.
谢谢@nizx,在swift 4***tap.cancelsTouchesInView = false***

4> Old McStophe..:

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

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

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


我将`setAllowsSelectionDuringEditing:`添加到列表中(当tableview处于编辑模式时)

5> Hunter..:

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

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


我发现虽然我的控制器是一个UITableViewController,但我在UI Builder中使用了一个普通的旧UIViewController小部件.这不起作用.当我删除UIViewController小部件并在其位置删除UITableViewController时,一切正常.

6> Bartłomiej S..:

如果出现问题,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



7> gilm..:

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

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

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


它开始在iOS 7上发生,在contentView中禁用"用户交互已启用"视图修复此问题.

8> JackPearse..:

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

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

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


for RecordRow在IndexPath上的正确签名是: - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {

9> Vinu David J..:

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

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:YourTable]) {
        return NO;
    }
    return YES;
}


`if([touch.view isDescendantOfView:YourTable])`

10> cpt.neverm1n..:

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

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

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



11> Mohsin Qures..:

你必须选择这些选项

在此输入图像描述

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

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

在此输入图像描述



12> Groot..:

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



13> spiralstairs..:

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

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



14> Jeyhun Karim..:

我有同样的问题,

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

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



15> Naveed Ahmad..:

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

在此输入图像描述



16> MB_iOSDevelo..:

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



17> Andrew Gorce..:

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

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

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



18> Carlos..:

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

[self.tableView setDelegate:self];

[self.tableView setDataSource:self];



19> Steve..:

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

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

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



20> gmogames..:

给我2美分.

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

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



21> HotJard..:

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

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



22> 小智..:

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



23> 小智..:

我知道是老问题得到解决,但也有类似的问题,我认为这个问题是我的自定义的UITableViewCell,但解决方案是完全不同 - 我重新启动的XCode :),然后工程确定!几乎像Windows :)



24> SleepsOnNews..:

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

这是不止几次让我着迷的!!



25> yvetterowe..:

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

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有