【问题标题】:iOS: UITableView Selective TouchesiOS:UITableView 选择性触摸
【发布时间】:2013-01-01 20:30:15
【问题描述】:

我有一个UITableView,它的某些单元格的高度不同。如果单元格中的触摸低于某个点,我希望有一种方法,无需向每个单元格添加按钮,就不会收到对 didSelectedRowAtIndexPath 的响应。

例如,假设我有两个单元格,一个高度为 100,另一个高度为 150。有没有办法在触摸低于 100 时不接收对 didSelectRowAtIndexPath: 的响应,但仍然接收到触摸在单元格上输入?

我想过重写单元格中的触摸方法并将委托中的接触点返回到控制器/表并使用该输入来确定我是否会忽略 didSelectRowAtIndexPath: 响应,但我很担心关于突出显示和其他调用,以及它是否可能不足以阻止这些调用。这对我来说似乎真的很可疑。

【问题讨论】:

    标签: objective-c ios uitableview didselectrowatindexpath


    【解决方案1】:

    我认为如果不对单元进行子类化,这是不可能的。

    我的建议是这样做:

    1. 创建单元的子类
    2. 向单元格添加额外的布尔 iVar,例如 didTapOutside
    3. 根据touchesBegan 方法中的 Y 位置点击将布尔值设置为 True 或 False
    4. didSelectRowAtIndexPath 中读取 didTapOutside 布尔变量并根据它的设置执行您的操作

    示例如下:

    @interface MyCustomCell : UITableViewCell {
        BOOL didTapOutside;
    }
    @property (atomic, readwrite) BOOL didTapOutside;
    

    以及实现:

    @implementation MyCustomCell
    
    @synthesize didTapOutside;
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:touch.view];
    
        didTapOutside =  (location.y>100);
    
        [super touchesBegan:touches withEvent:event];
    }
    

    【讨论】:

    • 所以,基本上我认为我必须重写 touches 方法并让该方法忽略基于布尔值的结果。不过,与单元格上的布尔属性相比,使用委托(适应协议)要轻得多。
    【解决方案2】:

    您可以创建一个自定义UITableViewCell 例如:

    CustomCell *cell = [[CustomCell alloc] initWithFrame:rect reuseIdentifier:identifier];
    

    您可以覆盖 CustomCell 中的 touchesBegan 方法并执行以下操作来获取触摸的位置:

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *aTouch = [touches anyObject];
        CGPoint point = [aTouch locationInView:self];
        // point.x and point.y have the coordinates of the touch
    
        // based on where the touch is... your custom code
    
        [super touchesBegan:touches withEvent:event];
    }
    

    【讨论】:

    • 感谢 Bej 的回复,但我已经在我的问题中提到了这种可能性。
    • 啊,对不起,我现在明白了。如果您担心调用顺序,我想您可以实现自己的 TableView 触摸控件。禁用触摸并将您自己的手势识别器添加到 tableview 控制器。然后选择要接收的触摸。我不确定这是否“不确定”。
    • 是的。我曾考虑过这一点,但后来我意识到我很懒惰,所以我想我只需要处理不确定性。不过,他们提出了很好的建议。不过,如果其他人能想出什么办法,我可能会暂时保持开放状态。再次感谢!
    【解决方案3】:

    对不起,我一开始读错了这个问题。对此没有简单的解决方案。

    如果您不想使用子类,您唯一可以做的就是在要检测触摸的区域上添加一个透明视图或按钮并在其上创建一个事件,而不是使用表格视图单元格方法。

    【讨论】:

    • 我对子类化没问题(特别是因为我的单元格已经被子类化了),但唯一的子类化解决方案非常不确定,特别是因为它基本上是在与其他线程竞争执行代码。
    • 嗯,我不能肯定地说,但是代表在什么时候在表格和单元格之间被调用?我知道触摸方法应该是第一位的,但是没有更多信息,就没有办法真正知道,是吗?
    • 如果他们都使用您添加的操作,您可以一起忽略 didSelectRowAtIndexPath。没有比赛,因为我们只是在寻找您自己添加到单元格中的操作。
    • @miex 当有人选择一个按钮时,我实际上是在寻找我自己的操作,但我仍然需要didSelectRowAtIndexPath: 调用,否则无论如何我都会忽略响应。不过谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多