【问题标题】:UITableView didSelectRowAtIndexPath not being calledUITableView didSelectRowAtIndexPath 未被调用
【发布时间】: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 添加到您的视图中?如果您不处理它,它可能会与您的表格视图的触摸发生冲突。

标签: ios objective-c uitableview delegates


【解决方案1】:

我遇到了一些可能的原因:

  1. 确保tableView的editing属性设置为NO。 didSelectRowAtIndex: 方法 在table 的editing 属性设置为YES 时不会被调用。默认情况下,此属性设置为 NO。

    self.tableView.editing = NO;
    
  2. 确保将allowsSelection 属性设置为YES。默认是。

  3. 尝试在viewDidLoad方法中调用[super viewDidLoad]或者在init初始化器中设置delegate和dataSource属性。

  4. 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;
    
    }
    
  5. (这实际上是我通常做的) 尝试从 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()。因此,请确保您在主线程上执行此操作。

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 1970-01-01
          • 2015-05-17
          • 2012-02-15
          • 2010-09-20
          • 1970-01-01
          • 2013-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多