UITableView didSelectRowAtIndexPath 未被调用
Posted
技术标签:
【中文标题】UITableView didSelectRowAtIndexPath 未被调用【英文标题】:UITableView didSelectRowAtIndexPath not being called 【发布时间】:2015-12-01 21:19:53 【问题描述】:我有一个带有 UITableView 的视图控制器。我将数据源和委托都设置为视图控制器。方法 cellForRowAtIndexPath: 正在被调用并且行为符合预期但是 didSelectRowAtIndexPath: 没有被调用。有什么想法吗?
我的 .h 中有这个:
@interface DetailViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
在 .m 中的 viewDidLoad 中,我有:
self.tableView.dataSource=self;
self.tableView.delegate=self;
cellForRowAtIndexPath 将被调用但没有 didSelectRowAtIndexPath 似乎没有意义。这是该方法现在的样子:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
NSLog(@"did select row at index path");
【问题讨论】:
我假设 tableview 是一个出口。您是否将委托连接到情节提要中的视图控制器? 是tableView.allowsSelection =YES;? 发布cellForRowAtIndexPath:
的代码并确保userInteractionEnabled = YES
和allowsSelection = YES
刚刚将这两个添加到 viewDidLoad。还是不行。
您是否将UIGestureRecognizer
添加到您的视图中?如果您不处理它,它可能会与您的表格视图的触摸发生冲突。
【参考方案1】:
我遇到了一些可能的原因:
确保tableView的editing属性设置为NO。 didSelectRowAtIndex: 方法 在table 的editing 属性设置为YES 时不会被调用。默认情况下,此属性设置为 NO。
self.tableView.editing = NO;
确保将allowsSelection 属性设置为YES。默认是。
尝试在viewDidLoad方法中调用[super viewDidLoad]或者在init初始化器中设置delegate和dataSource属性。
在loadView方法中设置delegate和dataSource属性,并将tableView赋值给UIViewController的view属性。这是一个例子:
- (void)loadView
UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain];
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
tableView.delegate = self;
tableView.dataSource = self;
[tableView reloadData];
self.view = tableView;
(这实际上是我通常做的) 尝试从 UITableViewController 继承 DetailViewController 子类,它也继承自 UIViewController。 UITableViewController 自动适应 UITableViewDelegate 和 UITableViewDataSource。
【讨论】:
【参考方案2】:视图控制器视图上的手势识别器阻止了触摸,通过将手势识别器的 cancelsTouchesInView
设置为 false 来解决。
【讨论】:
非常感谢您的帮助【参考方案3】:就我而言,我使用了 UITapGestureRecognizer,它对我来说就像一个魔术。
cell.tag=indexPath.row;
UITapGestureRecognizer* tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapOnCell:)];
[cell addGestureRecognizer:tap];
这是我的 tapOnCell 方法实现
-(void)tapOnCell:(UITapGestureRecognizer*)tap
ADPointCashTransaction* aTransaction=[transactionArray objectAtIndex:tap.view.tag];
// Work with aTransaction Object
【讨论】:
【参考方案4】:通过我围绕该问题的工作,将答案放在 seto nugroho 的 cmets 中。如果 tableView 中有手势识别器,则不会调用 didSelect 行。您可以做的是将手势识别器的点击次数增加到两次。
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
gestureRecognizer.numberOfTapsRequired = 2
view.addGestureRecognizer(gestureRecognizer)`
【讨论】:
【参考方案5】:我将再添加一个:确保在任何时候都没有任何其他视图与表格或单元格重叠,甚至是隐藏的视图。如果这样做,请在情节提要中禁用“已启用用户交互”,除非您明确需要通过视图捕捉手势。
【讨论】:
我认为禁用视图上的用户交互仍然会取消对底层视图的点击【参考方案6】:就我而言,我是在后台线程中分配数据源并调用 reloadData()。因此,请确保您在主线程上执行此操作。
【讨论】:
以上是关于UITableView didSelectRowAtIndexPath 未被调用的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 didSelectRowAtIndexPath 传递到另一个视图控制器 ios7