37

我正在创建一个基于表视图的应用程序。我为表格创建了一个自定义表格单元格,其中包含 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 而不是自定义单元格,那么我的问题也是一样的,委托方法不会着火。

自定义单元格属性:

在此处输入图像描述 在此处输入图像描述

4

7 回答 7

99

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

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

于 2013-08-10T06:57:13.327 回答
2

我遇到了类似的问题:

对我来说,问题是因为 myUITableView被添加到 anUIScrollView并且更具体地添加到它的contentView. 看来,在里面contentView,我必须按住 2-3 秒才能触发该didSelectRowAtIndexPath方法。

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

于 2014-01-27T14:52:54.820 回答
2

Maybe you will call the method

[tableView deselectRowAtIndexPath:indexPath animated:NO];

before Push ViewController or Other Operation. Like

- (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 ....
}

that`s solve my problem .

于 2016-07-01T09:43:56.953 回答
2

正如其他人所建议[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)
    }
 }
于 2018-12-20T11:25:54.103 回答
0

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

如果您面临同样的问题,则必须有一个 1. UITapGestureRecognizer 为您制造问题,或者 2. 您放置表格视图的滚动视图。

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

于 2015-11-18T11:01:14.580 回答
0

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

于 2017-05-24T08:48:32.493 回答
-2

我不确定这一点,但Delays Content Touches可能与它有关。

于 2013-08-10T06:19:55.133 回答