【问题标题】:iphone - didSelectRowAtIndexPath: only being called after long press on custom celliphone - didSelectRowAtIndexPath:仅在长按自定义单元格后调用
【发布时间】:2013-08-12 02:54:18
【问题描述】:

我正在创建一个基于表格视图的应用程序。我为表格创建了一个自定义表格单元格,其中包含 2 个标签、1 个图像和 1 个按钮。表视图数据源方法工作正常。我将 xib 用于自定义单元格和视图控制器类,并将委托和数据源连接到文件的所有者。但问题是当我选择表格行时,didSelectRowAtIndexPath 没有被触发。如前所述,发射它的唯一方法是按住电池约 3-4 秒。有谁知道为什么会这样?

感谢您的任何指点...

这是我的表格视图方法..

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [finalAddonsArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    NewCustomCell *cell = (NewCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *nib=[[NSBundle mainBundle]loadNibNamed:@"NewCustomCell" owner:self options:nil];
        cell=[nib objectAtIndex:0];
    }

    Addons *addons1=[[Addons alloc]init];
    addons1= [finalAddonsArray objectAtIndex:indexPath.row];

    if (addons1.data == nil) {
        cell.ivCategory.image = [UIImage imageNamed:@"blogo.jpg"];
    }
    else
    {
        cell.ivCategory.image=[UIImage imageWithData:addons1.data];
    }

    cell.lblTitle.text = addons1.name;
    if (addons1.price == nil) {
        cell.lblPrice.text = nil;
    }
    else{
        cell.lblPrice.text = [NSString stringWithFormat:@"%@ rs",addons1.price];
    }
    [cell.button addTarget:self
                    action:@selector(editButtonPressed:)
          forControlEvents:UIControlEventTouchUpInside];

    cell.button.tag=indexPath.row;
    index = indexPath;
    cell.selectionStyle = UITableViewCellSelectionStyleGray;

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"sjcjksbcjksbcfkebscf1234567890");
}

我得到的另一件事是,如果我使用默认 UITableViewCell 而不是自定义单元格,那么我的问题也是一样的,委托方法不会触发。

自定义单元格属性:

【问题讨论】:

  • didSelectRowAtIndexPath 方法在哪里?
  • 你为什么确定它被解雇了?您是否绝对确定这需要 3-4 秒,还是您期望的操作仅在那时发生?在 didSelectRowAtIndexPath 的第一行添加一个 NSLog 或断点。另外 - 单元格中按钮的大小是多少?
  • @nikhita我正在使用 didSelectRowAtIndexPath 方法更新我的问题。
  • 如果您从 didSelectRowAtIndexPath 推送视图控制器,我认为 nextViewcontroller 从 Web 服务加载一些数据。这就是为什么推动视图控制器需要 3_4 秒,而您认为 didSelectRowAtIndexPath 选择单元需要一些时间。
  • 单元格高亮怎么样?它是立即发生还是仅在延迟之后发生?周围有任何活跃的 UIGestureRecognizer 吗?

标签: ios objective-c uitableview


【解决方案1】:

同样的问题发生在我身上,因为我在它上面添加了一个点击手势识别器。 如果您使用过任何手势识别器,请尝试将其移除并检查是否导致问题。

编辑:阿里评论的解决方案: 如果您使用过点击手势,您可以使用[tap setCancelsTouchesInView:NO];

【讨论】:

  • @parserThanks,我有同样的 pblm。代表没有触发点击手势的 bcoz
  • 太好了...您指出了问题的原因....但是解决方案是什么...我在视图中有一些文本字段,我想关闭键盘轻敲。我该怎么做?
  • 在你的点击手势中添加这个[tap setCancelsTouchesInView:NO];
  • 为这个问题苦苦挣扎了几个小时!谢谢!
  • 谢谢兄弟!为我工作
【解决方案2】:

我也遇到过类似的问题:

对我来说,问题是因为我的UITableView 被添加到UIScrollView,更具体地说是添加到它的contentView。 看来在contentView 内部,我必须按住 2-3 秒才能触发 didSelectRowAtIndexPath 方法。

我将我的 TableView 移动到 self.view 而不是 contentView,它解决了问题!

【讨论】:

  • 不完全是,但它为我指明了正确的方向 ;-)
【解决方案3】:

也许你会调用方法

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在 Push ViewController 或其他操作之前。喜欢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    // 1. manual call this method to deSelect Other Cell
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    // 2. than do other operation
    PushViewController Or Some Animation ....
}

这解决了我的问题。

【讨论】:

    【解决方案4】:

    正如其他人所建议的那样,[tap setCancelsTouchesInView:NO]; 可以解决问题。 不过,我想澄清一件事:

    如果您认为您没有实现 tapgesture 并且对为什么必须将视图添加到受保护的视图中感到好奇,请查看您的类,因为您很可能继承了某个类并且该类中包含点击手势识别器。

    就我而言,我做了以下事情:

    - (NSMutableArray *)tapProtectedViews
    {
        NSMutableArray *views = [super tapProtectedViews];
        [views addObject:self.mTableView];
        return views;
    }
    

    为 Swift 4+ 编辑

    假设你有一个名为 tapGesture 的 UITapGestureRecognizer 实例:

    func disableTapGesture(){
        tapGesture.cancelsTouchesInView = false
    }
    

    或者你可以:

    if self.view.gestureRecognizers?.isEmpty == false{
        for recognizer in self.view.gestureRecognizers!{
            self.view.removeGestureRecognizer(recognizer)
        }
     }
    

    【讨论】:

    • “很可能你继承了某个类,并且该类包括点击手势识别器” - 这就是我的问题!
    【解决方案5】:

    亲爱的,我遇到了同样的问题。当我点击单元格但没有调用 didselectrowatindexpath 时,当我按下按钮几秒钟后松开按钮时突然调用它。

    如果您遇到同样的问题,一定有 1.为您制造问题的UITapGestureRecognizer 要么 2. 放置表格视图的滚动视图。

    因此,您应该删除放置表格视图的手势或超级滚动视图

    【讨论】:

      【解决方案6】:

      如果您的视图上有自定义手势对象,请检查override func gestureRecognizerShouldBegin(_ gesture: UIGestureRecognizer) -> Bool 委托。将自定义手势与发送者手势进行比较,如果不是自定义手势对象,则将其传递给超级。因此系统手势/点击不会被阻止。

      【讨论】:

        【解决方案7】:

        对此我不确定,但Delays Content Touches 可能与此有关。

        【讨论】:

        • 在您发布的第一个屏幕截图中,ScrollView 部分中,Delays Content Touches 属性已启用。尝试禁用它并对其进行测试。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 2014-11-30
        • 2010-11-05
        相关资源
        最近更新 更多