Ios 如果UITableViewCell中的UIButton为';它的UITableView';只有一个

Ios 如果UITableViewCell中的UIButton为';它的UITableView';只有一个,ios,uitableview,uibutton,uiaccessibility,kif,Ios,Uitableview,Uibutton,Uiaccessibility,Kif,如果UITableViewCell中嵌入了UITableViewCell的ui按钮,则自动点击该按钮时遇到问题。这是在KIF的UI自动化环境中实现的 这是我的相关电话: [tester tapViewWithAccessibilityLabel: @"LABEL" traits: UIAccessibilityTraitButton]; // trait only spec

如果
UITableViewCell
中嵌入了
UITableViewCell
ui按钮,则自动点击该按钮时遇到问题。这是在KIF的UI自动化环境中实现的

这是我的相关电话:

[tester tapViewWithAccessibilityLabel: @"LABEL"
                               traits: UIAccessibilityTraitButton];
                               // trait only specified for 2nd case below
以下是我观察到的情况:

  • 如果我将辅助功能标签放在
    UITableViewCell
    KIF的
    KIFUITestActor-waitforaccessibility元素:视图:withLabel:traits:tappable:
    返回
    UITableView
    ,而不是单元格。不知何故,该表似乎继承了它唯一的子级可访问性标签,并让KIF在递归搜索中首先遇到它

  • 如果我将辅助功能标签放在
    UIButton
    上,KIF会找到它,但确定它不可点击(即
    UIView kifaditions-tappablePointInRect:
    返回
    NO
    ),可能是因为按钮标签的细字体行之间主要是透明的(点击进入
    UITableViewCellContentView


解决方法可能是通过它的
nsindepath
点击行,但可能还有更好的方法来克服我所面临的障碍。那么,我如何通过调用
tapView…
,指示KIF点击这样的按钮呢?

这只是为了确认此解决方法是否适用:

[tester tapRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0] 
inTableViewWithAccessibilityIdentifier: @"IDENTIFIER"];
“好”的解决方案应该是这样的:

UITableViewCell *cell = [tester waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
UIAccessibilityElement *element = [cell accessibilityElementWithLabel:accessibilityLabel traits:UIAccessibilityTraitButton];
[tester tapAccessibilityElement:element inView:cell];
不幸的是,它没有按预期工作。有时
元素
是一个
UIAccessibilityYelementMockView
,在步骤3中点击它意味着只点击底层单元格。结果自然不会如预期的那样

我终于设法解决了这个问题,我做了以下几点:

MyCustomCellClass *cell = (MyCustomCellClass *)[self waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
[cell.buttonOutlet sendActionsForControlEvents:UIControlEventTouchUpInside];
请注意,这意味着

  • 减少对UI交互的依赖
  • 有一个自定义类
  • 有按钮出口的

  • 但是,嘿,苹果不支持KIF,所以它有时会中断:)

    如果您在代码中创建单元格,请确保将您的按钮添加到cell.contentView

    如果您是从xib加载单元格,请尝试使用以下方法将contentView发送到视图层次结构的后面(我还没有发现这样做的任何缺点):


    我不认为这是一个合格的答案,因为你没有点击电池内部的按钮,只是电池本身,这不是问题所在。
    [self sendSubviewToBack:self.contentView];