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 = YESallowsSelection = 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

连接 UITableView + UITableView

将 UITableView 推送到 UITableView

UItableview 单元格的动态高度与 UItableview 单元格内的 UItableview

UITableView