处理UITableViewCell内部的单独触摸

时间:2014-01-13 19:12:49

标签: ios uitableview touch

我有一个带UIButton和UIImageView的自定义UITableViewCell。我希望UIButton和UIImageView对象能够处理UITableViewDelegate的tableView:didSelectRowAtIndexPath:方法之外的触摸。

@implementation CustomTableViewController
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
      // handle cell selected
    }
@end

我的UITableViewCell:

@implementation CustomTableViewCell

    - (id)init {
        [button addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];

        [image addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageClicked)]];
        [image setUserInteractionEnabled:YES];
    }

    /*
     * I want these to be called instead of tableView:didSelectRowAtIndexPath:
     * when the button or image are tapped and I want
     * tableView:didSelectRowAtIndexPath: to be called when any other part of
     * the cell is tapped.
     */

    - (void)buttonClicked {
        // not called
    }

    - (void)imageClicked {
        // not called
    }
@end

如何调用buttonClicked和imageClicked而不是控制器的didSelectRowAtIndexPath

2 个答案:

答案 0 :(得分:0)

我不知道你想做什么,所以这可能有所帮助,但在storyboard / xib文件中有一个名为Delays Content Touches的属性。这个属性基本上说,它会在子视图之前考虑表/ scrollview,但是如果你取消选中它会在滚动之前考虑子视图。

当然这会让位于其他错误,比如能够在滚动时触摸按钮/图像,但如果这无关紧要,那么这可能是您的解决方案。

为了获得最佳效果,请确保canCancelContentTouches属性(故事板中的Cancellable Content Touches)设置为YES(或选中),这基本上表示如果按下按钮然后拖动手指即滚动视图将开始滚动并取消触摸事件。

您可以在UIScrollView Class Reference

中详细了解该属性

答案 1 :(得分:0)

CustomTableViewCell中我们有以下内容:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches] anyObject];
    if (CGRectContainsPoint([self.button frame], [touch locationInView:self])){
        [self buttonClicked];
        /* Added this to resolve the issue
         * [super touchesCancelled:touches withEvent:nil];
         */
    }
    else if (CGRectContainsPoint([self.container frame], [touch locationInView:self])) {
        [super touchesEnded:touches withEvent:event];
    }
    else{
        [self imageClicked];
        /* Added this to resolve the issue
         * [super touchesCancelled:touches withEvent:nil];
         */
    }

}

我们在第一个和第三个条件中添加了[super touchesCancelled],这似乎已经完成了我们想要的,但是我们自己调用touchesCancelled似乎是错误的。有没有更好的方法来处理这些案件?