Skip to content

Commit 32fdb16

Browse files
Nobodymaterial-automation
authored andcommitted
This CL makes two changes:
1. Adds a new delegate method `chipFieldShouldEndEditing` to match `chipFieldShouldBeginEditing` 2. Moved the call to the chip field delegate for `chipFieldDidBeginEditing` and `chipFieldDidEndEditing` so they are fired at the correct time. I noticed that the UITextFieldDelegate method `textFieldShouldBeginEditing` can be called without actually becoming the first responder if the previous first responder doesn't resign it. That meant that the chip field would still claim to have begun editing even if it hadn't. PiperOrigin-RevId: 367240207
1 parent 1405e19 commit 32fdb16

File tree

3 files changed

+78
-12
lines changed

3 files changed

+78
-12
lines changed

components/Chips/src/MDCChipField.m

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -557,18 +557,27 @@ - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
557557
if ([self.delegate respondsToSelector:@selector(chipFieldShouldBeginEditing:)]) {
558558
shouldBeginEditing = [self.delegate chipFieldShouldBeginEditing:self];
559559
}
560-
if (shouldBeginEditing) {
561-
if (textField == self.textField) {
562-
[self deselectAllChips];
563-
}
564-
if ([self.delegate respondsToSelector:@selector(chipFieldDidBeginEditing:)]) {
565-
[self.delegate chipFieldDidBeginEditing:self];
566-
}
567-
}
568560
return shouldBeginEditing;
569561
}
570562

571563
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
564+
BOOL shouldEndEditing = YES;
565+
if ([self.delegate respondsToSelector:@selector(chipFieldShouldEndEditing:)]) {
566+
shouldEndEditing = [self.delegate chipFieldShouldEndEditing:self];
567+
}
568+
return shouldEndEditing;
569+
}
570+
571+
- (void)textFieldDidBeginEditing:(UITextField *)textField {
572+
if (textField == self.textField) {
573+
[self deselectAllChips];
574+
}
575+
if ([self.delegate respondsToSelector:@selector(chipFieldDidBeginEditing:)]) {
576+
[self.delegate chipFieldDidBeginEditing:self];
577+
}
578+
}
579+
580+
- (void)textFieldDidEndEditing:(UITextField *)textField {
572581
if ((self.delimiter & MDCChipFieldDelimiterDidEndEditing) == MDCChipFieldDelimiterDidEndEditing) {
573582
if (textField == self.textField) {
574583
[self commitInput];
@@ -577,7 +586,6 @@ - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
577586
if ([self.delegate respondsToSelector:@selector(chipFieldDidEndEditing:)]) {
578587
[self.delegate chipFieldDidEndEditing:self];
579588
}
580-
return YES;
581589
}
582590

583591
- (BOOL)textFieldShouldReturn:(UITextField *)textField {

components/Chips/src/MDCChipFieldDelegate.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
*/
2424
- (BOOL)chipFieldShouldBeginEditing:(nonnull MDCChipField *)chipField;
2525

26+
/**
27+
Asks the delegate if editing should end in the specified chip field.
28+
29+
@param chipField The @c MDCChipField where is about to end.
30+
*/
31+
- (BOOL)chipFieldShouldEndEditing:(nonnull MDCChipField *)chipField;
32+
2633
/**
2734
Tells the delegate that editing began in the specified chip field.
2835

components/Chips/tests/unit/ChipsDelegateTests.m

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ @interface ChipsDelegateTests : XCTestCase <MDCChipFieldDelegate>
2424
@property(nonatomic, nullable) MDCChipField *chip;
2525
@property(nonatomic, copy, nullable) NSString *delegateTextInput;
2626
@property(nonatomic) BOOL delegateShouldBeginEditing;
27+
@property(nonatomic) BOOL delegateShouldEndEditing;
2728
@property(nonatomic) BOOL delegateDidBeginEditingCalled;
29+
@property(nonatomic) BOOL delegateDidEndEditingCalled;
2830

2931
@end
3032

@@ -36,14 +38,17 @@ - (void)setUp {
3638
self.chip = [[MDCChipField alloc] init];
3739
self.chip.delegate = self;
3840
self.delegateShouldBeginEditing = YES;
41+
self.delegateShouldEndEditing = YES;
3942
}
4043

4144
- (void)tearDown {
4245
self.delegateTextInput = nil;
4346
self.chip.delegate = nil;
4447
self.chip = nil;
4548
self.delegateShouldBeginEditing = YES;
49+
self.delegateShouldEndEditing = YES;
4650
self.delegateDidBeginEditingCalled = NO;
51+
self.delegateDidEndEditingCalled = NO;
4752
[super tearDown];
4853
}
4954

@@ -68,7 +73,7 @@ - (void)testTouchUpOnClearButtonInvokesDidChangeInputOnDelegate {
6873
XCTAssertEqual((unsigned long)self.delegateTextInput.length, 0UL);
6974
}
7075

71-
- (void)testDelegateShouldNotBeginEditingDoesNotTriggerDidBeginEditing {
76+
- (void)testDelegateShouldNotBeginEditing {
7277
// Given
7378
self.delegateShouldBeginEditing = NO;
7479

@@ -78,10 +83,9 @@ - (void)testDelegateShouldNotBeginEditingDoesNotTriggerDidBeginEditing {
7883

7984
// Then
8085
XCTAssertFalse(shouldBeginEditing);
81-
XCTAssertFalse(self.delegateDidBeginEditingCalled);
8286
}
8387

84-
- (void)testShouldBeginEditingTriggersDidBeginEditing {
88+
- (void)testShouldBeginEditing {
8589
// Given
8690
self.delegateShouldBeginEditing = YES;
8791

@@ -91,9 +95,48 @@ - (void)testShouldBeginEditingTriggersDidBeginEditing {
9195

9296
// Then
9397
XCTAssertTrue(shouldBeginEditing);
98+
}
99+
100+
- (void)testTextFieldDidBeginEditingTriggersDidBeginEditing {
101+
// When
102+
[self.chip.textField.delegate textFieldDidBeginEditing:self.chip.textField];
103+
104+
// Then
94105
XCTAssertTrue(self.delegateDidBeginEditingCalled);
95106
}
96107

108+
- (void)testDelegateShouldNotEndEditing {
109+
// Given
110+
self.delegateShouldEndEditing = NO;
111+
112+
// When
113+
BOOL shouldEndEditing =
114+
[self.chip.textField.delegate textFieldShouldEndEditing:self.chip.textField];
115+
116+
// Then
117+
XCTAssertFalse(shouldEndEditing);
118+
}
119+
120+
- (void)testDelegateShouldEndEditing {
121+
// Given
122+
self.delegateShouldEndEditing = YES;
123+
124+
// When
125+
BOOL shouldEndEditing =
126+
[self.chip.textField.delegate textFieldShouldEndEditing:self.chip.textField];
127+
128+
// Then
129+
XCTAssertTrue(shouldEndEditing);
130+
}
131+
132+
- (void)testTextFieldDidEndEditingTriggersDidEndEditing {
133+
// When
134+
[self.chip.textField.delegate textFieldDidEndEditing:self.chip.textField];
135+
136+
// Then
137+
XCTAssertTrue(self.delegateDidEndEditingCalled);
138+
}
139+
97140
#pragma mark - MDCChipFieldDelegate
98141

99142
- (void)chipField:(nonnull MDCChipField *)chipField didChangeInput:(nullable NSString *)input {
@@ -108,4 +151,12 @@ - (void)chipFieldDidBeginEditing:(MDCChipField *)chipField {
108151
self.delegateDidBeginEditingCalled = YES;
109152
}
110153

154+
- (BOOL)chipFieldShouldEndEditing:(MDCChipField *)chipField {
155+
return self.delegateShouldEndEditing;
156+
}
157+
158+
- (void)chipFieldDidEndEditing:(MDCChipField *)chipField {
159+
self.delegateDidEndEditingCalled = YES;
160+
}
161+
111162
@end

0 commit comments

Comments
 (0)