我正在选项卡视图中编写一个带有表格视图的iOS应用程序。在我的UITableViewController
中,我实现了-tableView:didSelectRowAtIndexPath:
,但是当我在运行时选择一行时,该方法没有被调用。正在填充表视图,所以我知道我的控制器中正在调用其他tableView方法。
有没有人有任何想法,我可能搞砸了,以实现这一目标?
这听起来似乎该类不是该表视图的UITableViewDelegate
,尽管UITableViewController
应该自动设置。
您是否有机会将委托重置为其他课程?
我遇到了一个问题,经过几个月没看到我的代码后,我忘记了由于一些不必要的要求,我实施了以下方法
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
它应该为一行返回YES以使其被选中。
我在我的桌子视图上放了一个UITapGestureRecognizer
来解雇阻止didSelectRowAtIndexPath:
被调用的键盘。希望它可以帮助某人。
如果您遇到与我相同的问题:显然,如果您的tableView处于编辑模式,则不会调用此方法。您必须将allowsSelectionDuringEditing设置为true。
通过这个问题:When editing, `UITableView` does not call didSelectRowAtIndexPath ??
我有同样的问题,
原因是使用UITapGestureRecognizer
。当我在其他任何地方拍摄时,我希望键盘能够解散。我意识到这会覆盖所有点击动作,这就是为什么didSelectRowAtIndexPath
函数没有调用。
当我评论与UITapGestureRecognizer
相关的行时,它可以工作。此外,如果敲击是UITapGestureRecognizer selector
,你可以检查UITableViewCell
的功能。
即使已经接受了另一个答案,我还会为观察此问题的人添加一个可能的问题和解决方案:
如果启用了自动引用计数(ARC),您可能会发现即使在将控制器指定为视图的委托之后,由于ARC正在删除控制器,因此未向控制器发送视图的消息。显然,UITableView的委托指针不算作ARC的引用,因此如果它是对它的唯一引用,则控制器将被解除分配。您可以通过在控制器上实现dealloc方法并在那里设置断点或NSLog调用来验证是否发生了这种情况。
解决方案是通过其他地方的强引用来跟踪控制器,直到您确定不再需要它为止。
请记住在viewDidLoad方法中设置数据源和委托,如下所示:
[self.tableView setDelegate:self];
[self.tableView setDataSource:self];
我的问题不是上述问题。太蹩脚了。但我想我会把它列在这里,以防它帮助某人。
我有一个tableViewController
,这是我的“基础”控制器,然后我创建这个控制器的子类。我在“基础”课程中编写了tableView:didSelectRowAtIndexPath
例程中的所有代码。完全忘记了默认情况下,我的所有子类中也创建了这个例程(尽管没有任何代码可以做任何事情)。因此,当我运行我的应用程序时,它运行代码的子类版本,什么也没做,让我伤心。所以当然,一旦我从子类中删除了例程,它就使用了mt“base”类例程,而且我在做生意。
我知道。不要笑。但也许这会在我失去的时刻拯救某人......
以防万一有人像我一样犯了同样的愚蠢错误:
看看你期望成为didSelect
的方法名称是否可能会以某种方式偶然得到didDeselect
。我花了大约两个小时才发现......
给我2美分。
我有一个自定义UITableViewCell,并且有一个按钮覆盖整个单元格,所以当触摸发生时,按钮被选中而不是单元格。
删除按钮或在我的情况下,我在按钮上将User Interaction Enabled设置为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;
}
可能导致该问题的另一个问题是未选择的选择类型:
应该是Single Selection
正常选择,不应该是No Selection
。
好的,在这里更新,因为我遇到了这个问题,我的问题与此处发现的略有不同。
我查看了IB并看到我的委托WAS已设置,但它被错误地设置为VIEW而不是File的所有者(右键单击表视图以查看委托指向的位置)。
希望能帮助别人
另一种可能性是UITapGestureRecognizer可能正在吃这些事件,如下所示:https://stackoverflow.com/a/9248827/214070
我没有怀疑这个原因,因为表格细胞仍然会突出蓝色,好像水龙头正在通过。
所有好的答案,但还有一个值得关注......
(特别是以编程方式创建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
在这种情况下我遇到过两件事。
我曾经也有过一样的问题。而且很难找到。但在我的代码中的某处是:
- (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;
}