diff --git a/Integration Tests/Tests/SLTextFieldTest.m b/Integration Tests/Tests/SLTextFieldTest.m index 7e25148..d00c3ab 100644 --- a/Integration Tests/Tests/SLTextFieldTest.m +++ b/Integration Tests/Tests/SLTextFieldTest.m @@ -47,7 +47,8 @@ - (void)setUpTestCaseWithSelector:(SEL)testSelector { testSelector == @selector(testSetTextWhenFieldClearsOnBeginEditing) || testSelector == @selector(testGetText) || testSelector == @selector(testDoNotMatchEditorAccessibilityObjects) || - testSelector == @selector(testClearTextButton)) { + testSelector == @selector(testClearTextButton) || + testSelector == @selector(testSetTextWithinTableViewCellUnderControl)) { _textField = [SLTextField elementWithAccessibilityLabel:@"test element"]; } else if (testSelector == @selector(testMatchesSearchBarTextField) || testSelector == @selector(testSetSearchBarText) || @@ -76,6 +77,13 @@ - (void)testSetTextWithinTableViewCell { SLAssertTrue([SLAskApp(text) isEqualToString:expectedText], @"Text was not set to expected value."); } +- (void)testSetTextWithinTableViewCellUnderControl { + NSString *const expectedText = @"Fooness"; + SLAssertNoThrow([UIAElement(_textField) setText:expectedText], @"Should not have thrown."); + SLAssertNoThrow([UIAElement(_textField) tap], @"Should not have thrown."); + SLAssertTrue([SLAskApp(text) isEqualToString:expectedText], @"Text was not set to expected value."); +} + - (void)testSetTextCanHandleTapHoldCharacters { NSString *const expectedText = @"foo’s a difficult string to type!"; SLAssertNoThrow([UIAElement(_textField) setText:expectedText], @"Should not have thrown."); diff --git a/Integration Tests/Tests/SLTextFieldTestViewController.m b/Integration Tests/Tests/SLTextFieldTestViewController.m index 36b1df2..9b1c3c0 100644 --- a/Integration Tests/Tests/SLTextFieldTestViewController.m +++ b/Integration Tests/Tests/SLTextFieldTestViewController.m @@ -42,6 +42,7 @@ - (void)loadViewForTestCase:(SEL)testCase { if (testCase == @selector(testSetText) || testCase == @selector(testSetTextWithinTableViewCell) || + testCase == @selector(testSetTextWithinTableViewCellUnderControl) || testCase == @selector(testSetTextCanHandleTapHoldCharacters) || testCase == @selector(testSetTextClearsCurrentText) || testCase == @selector(testSetTextClearsCurrentTextWithinTableViewCell) || @@ -55,7 +56,8 @@ - (void)loadViewForTestCase:(SEL)testCase { _textField = [[UITextField alloc] initWithFrame:kTextFieldFrame]; if (testCase == @selector(testSetTextWithinTableViewCell) || - testCase == @selector(testSetTextClearsCurrentTextWithinTableViewCell)) { + testCase == @selector(testSetTextClearsCurrentTextWithinTableViewCell) || + testCase == @selector(testSetTextWithinTableViewCellUnderControl)) { _tableView = [[UITableView alloc] initWithFrame:(CGRect){CGPointZero, CGSizeMake(320.0f, 44.0f)}]; _tableView.dataSource = self; [view addSubview:_tableView]; @@ -101,6 +103,7 @@ - (void)viewDidLoad { [super viewDidLoad]; _textField.accessibilityLabel = @"test element"; + _textField.autocorrectionType = UITextAutocorrectionTypeNo; _textField.borderStyle = UITextBorderStyleRoundedRect; if (self.testCase == @selector(testClearTextButton)) { _textField.clearButtonMode = UITextFieldViewModeAlways; @@ -161,6 +164,7 @@ - (NSString *)text { NSString *text; if (self.testCase == @selector(testSetText) || self.testCase == @selector(testSetTextWithinTableViewCell) || + self.testCase == @selector(testSetTextWithinTableViewCellUnderControl) || self.testCase == @selector(testSetTextCanHandleTapHoldCharacters) || self.testCase == @selector(testSetTextClearsCurrentText) || self.testCase == @selector(testSetTextClearsCurrentTextWithinTableViewCell) || @@ -201,7 +205,14 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N _textField.textColor = [UIColor blackColor]; [_textField becomeFirstResponder]; - [tableViewCell.contentView addSubview:_textField]; + if (self.testCase == @selector(testSetTextWithinTableViewCellUnderControl)) { + UIControl *control = [[UIControl alloc] initWithFrame:self.view.bounds]; + [control addSubview:_textField]; + + [tableViewCell.contentView addSubview:control]; + } else { + [tableViewCell.contentView addSubview:_textField]; + } return tableViewCell; } diff --git a/Sources/Classes/UIAutomation/User Interface Elements/NSObject+SLAccessibilityHierarchy.m b/Sources/Classes/UIAutomation/User Interface Elements/NSObject+SLAccessibilityHierarchy.m index 6777bd4..5c68780 100644 --- a/Sources/Classes/UIAutomation/User Interface Elements/NSObject+SLAccessibilityHierarchy.m +++ b/Sources/Classes/UIAutomation/User Interface Elements/NSObject+SLAccessibilityHierarchy.m @@ -450,9 +450,40 @@ - (BOOL)classForcesPresenceInAccessibilityHierarchy { @implementation UIControl (SLAccessibilityHierarchy) + - (BOOL)classForcesPresenceInAccessibilityHierarchy { - return YES; + BOOL forcesPresence = YES; + BOOL containedWithinTableView = NO; + + id parent = self; + do { + parent = [parent slAccessibilityParent]; + + if ([parent isKindOfClass:[UITableView class]]) { + containedWithinTableView = YES; + } + } while (parent && !containedWithinTableView); + + if (containedWithinTableView) { + NSMutableArray *children = [[self slChildAccessibilityElementsFavoringSubviews:YES] mutableCopy]; + NSUInteger i = 0; + while (i < children.count) { + id child = children[i]; + + if ([child isKindOfClass:[UIControl class]]) { + forcesPresence = NO; + break; + } + + [children addObjectsFromArray:[child slChildAccessibilityElementsFavoringSubviews:YES]]; + + ++i; + } + } + + return forcesPresence; } + @end