-didSelectRowAtIndexPath:不是被称为
-
05-07-2019 - |
题
我在写一个有一个图表内卡图。我 UITableViewController
, 我实现的 -tableView:didSelectRowAtIndexPath:
, 但当我选择了一行,在运行时,该方法是不是正在叫。表认为是填充的,所以我知道,其他提供方法在我的控制。
没有任何人有任何想法什么我可能搞砸了让这种事发生?
解决方案
听起来该类可能不是该表视图的 UITableViewDelegate
,但 UITableViewController
应该自动设置。
您是否有机会将委托重置为其他课程?
其他提示
以防有人犯了与我一样的愚蠢错误:
检查您希望 didSelect
的方法名称是否可能以某种方式意外获得 didDeselect
。我花了大约两个小时才发现...
可能导致问题的另一个问题不是选择选择类型:
Single Selection
用于正常选择,不 No Selection
。
另一种可能性是UITapGestureRecognizer可能正在吃这些事件,如下所示: https://stackoverflow.com/a /二十一万四千零七十零分之九百二十四万八千八百二十七
我没有怀疑这个原因,因为表格单元格仍会突出显示蓝色,就像水龙头正在通过一样。
所有好的答案,但还有一个要注意......
(特别是在以编程方式创建UITableView时)
确保tableView可以通过设置 [tableView setAllowsSelection:YES];
或删除任何将其设置为 NO
的行来响应选择。
如果问题出现 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
在这种情况下我遇到过两件事。
-
您可能忘记实施UITableViewDelegate协议,或者您的班级与您的表格视图之间没有授权插座。
-
您的行内可能有一个UIView,它是第一个响应者,可以点击您的点击。说一个UIButton或类似的东西。
醇>
我遇到了同样的问题。而且很难找到。但在我的代码中的某个地方 是这样的:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}
必须是 return indexPath
,否则 -tableView:didSelectRowAtIndexPath:
未被调用。
如果您在UITableView上添加了gestureRecognizer,则不会调用 didSelectRowAtIndexPath
。
因此,您需要使用gestureRecognizer委托方法来避免在特定视图中触摸。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isDescendantOfView:YourTable]) {
return NO;
}
return YES;
}
我遇到了一个问题,经过几个月不看我的代码后,我忘记了由于一些不必要的要求而实施了以下方法
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
它应该为一行返回YES以使其被选中。
我在表视图上放了一个 UITapGestureRecognizer
来解除阻止 didSelectRowAtIndexPath:
被调用的键盘。希望它可以帮到某人。
如果您遇到与我相同的问题: 显然,如果tableView处于编辑模式,则不会调用此方法。您必须将allowsSelectionDuringEditing设置为true。
我遇到了同样的问题,
原因是使用 UITapGestureRecognizer
。当我在其他任何地方拍摄时,我希望键盘能够解散。我意识到这会覆盖所有tap操作,这就是为什么 didSelectRowAtIndexPath
函数没有调用。
当我评论与 UITapGestureRecognizer
相关的行时,它可以正常工作。此外,如果点击的是 UITableViewCell
,你可以检查 UITapGestureRecognizer selector
的功能。
即使已经接受了另一个答案,我还会为观察此问题的人添加一个可能的问题和解决方案:
如果启用了自动引用计数(ARC),您可能会发现即使将控制器指定为视图的委托,也不会收到视图到控制器的消息,因为ARC正在删除控制器。显然,UITableView的委托指针不算作ARC的引用,因此如果它是对它的唯一引用,则控制器将被解除分配。您可以通过在控制器上实现dealloc方法并在那里设置断点或NSLog调用来验证是否发生了这种情况。
解决方案是通过其他地方的强引用来跟踪控制器,直到您确定不再需要它为止。
请记住在viewDidLoad方法中设置数据源和委托,如下所示:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
我的问题不是上述问题。太蹩脚了。但我想我会把它列在这里,以防它帮助某人。
我有一个 tableViewController
,它是我的“基础”控制器,然后我创建此控制器的子类。我在“base”中的 tableView:didSelectRowAtIndexPath
例程中编写了我的所有代码。类。完全忘记了默认情况下,我的所有子类中也创建了这个例程(尽管没有任何代码可以做任何事情)。因此,当我运行我的应用程序时,它运行代码的子类版本,什么也没做,让我伤心。当然,一旦我从子类中删除了例程,它就使用了mt“base”。课程例行,我在做生意。
我知道。不要笑。但也许这会在我失去的那个时刻拯救某人...
给我2美分。
我有一个自定义UITableViewCell并且有一个覆盖整个单元格的按钮,所以当触摸发生时,按钮被选中而不是单元格。
要么删除按钮,要么在我的情况下,我在按钮上将User Interation Enable设置为false,这样单元格就是选中的。
如果你读到这个,那么仍然无法解决问题。
我有自定义单元格,其中复选框“用户互动已启用”被禁用了。所以,我只是打开它。祝好运。
我刚刚拥有这个并且过去发生在我身上的事情没有用,因为我在尝试添加方法时没有注意自动完成,我实际上最终实现了 tableView:didDeselectRowAtIndexPath
:而不是 tableView:didSelectRowAtIndexPath:
。
我知道已经过时了,问题解决了,但是有一个类似的问题,我认为问题出在我的自定义UITableViewCell上,但解决方案完全不同 - 我重启XCode :)然后工作正常!几乎像Windows:)
如果您的表视图处于编辑模式(例如 [tableView setEditing:YES animated:NO];
),则需要设置 tableView.allowsSelectionDuringEditing = YES;
确保您实现了 tableView:didSelectRowAtIndexPath
而不是 tableView:didDeSelectRowAtIndexPath
这让我有好几次!!
你可能做的另一个错误(正如我所做的):如果在单元格中设置了segue,则不会调用 didSelectRowAtIndexPath
。您应该在视图控制器中设置segue。
这些答案都不适合我。大约一个小时后,我发现了一些非常阴险的东西:
我在另一个表视图的单元格内有一个表视图。我决定创建一个包含内部表视图的封闭视图。我将此视图称为contentView并将其连接到xib中。
事实证明,UITableViewCell已经有了一个contentView,并且用它做了一些奇怪的事情。当我将属性重命名为mainContentView并将视图重新连接到此重命名的属性时,问题自行解决。
就我而言,我在加载时动态计算 TableView
的 SuperView
的高度。由于计算错误, TableView
位于 SuperView
之外。 TableView
被绘制得很好,但所有交互都被禁用(并且从未调用 didSelectRowAtIndexPath
)。很难检测,因为没有视觉指示 TableView
不可“访问”。
在我的情况下,解决方案是在下面的函数中将NO更改为YES。
iOS 9 +
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
好的,在这里更新我刚遇到这个问题,我的问题与此处发现的略有不同。
我查看了IB并看到我的委托已设置,但是它被错误地设置为VIEW而不是File的所有者(右键单击表视图以查看委托指向的位置)。
希望能帮到某人