KIF 无法点击 UITableViewCell 中的 UIButton 如果它是它的 UITableView 的唯一一个
KIF cannot tap UIButton inside UITableViewCell if it's its UITableView's only one
我在自动点击嵌入在 UITableViewCell
中的 UIButton
时遇到问题,如果该单元格是 table 的唯一单元格。这是在使用 KIF UI 自动化的上下文中。
这是我的相关电话:
[tester tapViewWithAccessibilityLabel: @"LABEL"
traits: UIAccessibilityTraitButton];
// trait only specified for 2nd case below
这是我观察到的:
如果我将可访问性标签放在 UITableViewCell
KIF 的 KIFUITestActor - waitForAccessibilityElement:view:withLabel:traits:tappable:
returns 和 UITableView
上,而不是单元格。 table 似乎以某种方式继承了其唯一子项的可访问性标签,并让 KIF 在其递归搜索期间首先遇到它。
如果我将辅助功能标签放在 UIButton
上,KIF 会找到它但确定它不可点击(即 UIView-KIFAdditions -tappablePointInRect:
returns NO
),大概是因为它在按钮标签的细字体线之间主要是透明的(点击转到 UITableViewCellContentView
)。
解决方法可能是点击 NSIndexPath
行,但也许还有更好的方法来克服我所面临的上述障碍。那么我如何指示 KIF 通过调用 tapView...
?
来点击这样的按钮
这只是为了确认此解决方法适用:
[tester tapRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]
inTableViewWithAccessibilityIdentifier: @"IDENTIFIER"];
"good" 解决方案应该是这样的:
UITableViewCell *cell = [tester waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
UIAccessibilityElement *element = [cell accessibilityElementWithLabel:accessibilityLabel traits:UIAccessibilityTraitButton];
[tester tapAccessibilityElement:element inView:cell];
不幸的是,它没有按预期工作。有时 element
是 UIAccessibilityElementMockView
并且在第 3 步引导中点击它意味着只需点击底层单元格。结果自然不会像预期的那样。
我终于通过以下方式解决了这个问题:
MyCustomCellClass *cell = (MyCustomCellClass *)[self waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
[cell.buttonOutlet sendActionsForControlEvents:UIControlEventTouchUpInside];
注意这意味着
- 较少依赖UI互动
- 有一个习惯class
- 有一个按钮的出口
但是,嘿,KIF 不受 Apple 支持,所以它有时会中断 :)
如果您在代码中制作单元格,请确保您的按钮已添加到 cell.contentView。
如果您从 xib 加载单元格,请尝试将 contentView 发送到视图层次结构的后面(我还没有发现这样做有任何缺点):
[self sendSubviewToBack:self.contentView];
我在自动点击嵌入在 UITableViewCell
中的 UIButton
时遇到问题,如果该单元格是 table 的唯一单元格。这是在使用 KIF UI 自动化的上下文中。
这是我的相关电话:
[tester tapViewWithAccessibilityLabel: @"LABEL"
traits: UIAccessibilityTraitButton];
// trait only specified for 2nd case below
这是我观察到的:
如果我将可访问性标签放在
UITableViewCell
KIF 的KIFUITestActor - waitForAccessibilityElement:view:withLabel:traits:tappable:
returns 和UITableView
上,而不是单元格。 table 似乎以某种方式继承了其唯一子项的可访问性标签,并让 KIF 在其递归搜索期间首先遇到它。如果我将辅助功能标签放在
UIButton
上,KIF 会找到它但确定它不可点击(即UIView-KIFAdditions -tappablePointInRect:
returnsNO
),大概是因为它在按钮标签的细字体线之间主要是透明的(点击转到UITableViewCellContentView
)。
解决方法可能是点击 NSIndexPath
行,但也许还有更好的方法来克服我所面临的上述障碍。那么我如何指示 KIF 通过调用 tapView...
?
这只是为了确认此解决方法适用:
[tester tapRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: 0]
inTableViewWithAccessibilityIdentifier: @"IDENTIFIER"];
"good" 解决方案应该是这样的:
UITableViewCell *cell = [tester waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
UIAccessibilityElement *element = [cell accessibilityElementWithLabel:accessibilityLabel traits:UIAccessibilityTraitButton];
[tester tapAccessibilityElement:element inView:cell];
不幸的是,它没有按预期工作。有时 element
是 UIAccessibilityElementMockView
并且在第 3 步引导中点击它意味着只需点击底层单元格。结果自然不会像预期的那样。
我终于通过以下方式解决了这个问题:
MyCustomCellClass *cell = (MyCustomCellClass *)[self waitForCellAtIndexPath:indexPath inTableViewWithAccessibilityIdentifier:tableAccessibilityIdentifier];
[cell.buttonOutlet sendActionsForControlEvents:UIControlEventTouchUpInside];
注意这意味着
- 较少依赖UI互动
- 有一个习惯class
- 有一个按钮的出口
但是,嘿,KIF 不受 Apple 支持,所以它有时会中断 :)
如果您在代码中制作单元格,请确保您的按钮已添加到 cell.contentView。
如果您从 xib 加载单元格,请尝试将 contentView 发送到视图层次结构的后面(我还没有发现这样做有任何缺点):
[self sendSubviewToBack:self.contentView];