Skip to content

Commit 8a96405

Browse files
committed
Ensure responder demand is reset after view update completes.
1 parent a004908 commit 8a96405

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

Sources/ResponsiveTextField/ResponsiveTextField.swift

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,6 @@ extension ResponsiveTextField: UIViewRepresentable {
315315
/// first responder.
316316
///
317317
public func updateUIView(_ uiView: UITextField, context: Context) {
318-
guard context.coordinator.shouldUpdateView else {
319-
context.coordinator.shouldUpdateView = true
320-
return
321-
}
322-
323318
uiView.isEnabled = isEnabled
324319
uiView.isSecureTextEntry = isSecure
325320
uiView.returnKeyType = returnKeyType
@@ -337,13 +332,22 @@ extension ResponsiveTextField: UIViewRepresentable {
337332
default:
338333
// If the current responder state matches the demand then
339334
// the demand is already fulfilled so we can just reset it.
340-
context.coordinator.firstResponderDemandFulfilled()
335+
resetFirstResponderDemandAfterViewUpdate()
336+
}
337+
}
338+
339+
fileprivate func resetFirstResponderDemandAfterViewUpdate() {
340+
// Because the first responder demand will trigger a view
341+
// update when it is set, we need to wait until the next
342+
// runloop tick to reset it back to nil to avoid runtime
343+
// warnings.
344+
RunLoop.main.schedule {
345+
firstResponderDemand?.wrappedValue = nil
341346
}
342347
}
343348

344349
public class Coordinator: NSObject, UITextFieldDelegate {
345350
var parent: ResponsiveTextField
346-
var shouldUpdateView: Bool = true
347351

348352
@Binding
349353
var text: String
@@ -353,16 +357,11 @@ extension ResponsiveTextField: UIViewRepresentable {
353357
self._text = textField.text
354358
}
355359

356-
fileprivate func firstResponderDemandFulfilled() {
357-
shouldUpdateView = false
358-
parent.firstResponderDemand?.wrappedValue = nil
359-
}
360-
361360
public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
362361
if let canBecomeFirstResponder = parent.onFirstResponderStateChanged?.canBecomeFirstResponder {
363362
let shouldBeginEditing = canBecomeFirstResponder()
364363
if !shouldBeginEditing {
365-
firstResponderDemandFulfilled()
364+
parent.resetFirstResponderDemandAfterViewUpdate()
366365
}
367366
return shouldBeginEditing
368367
}
@@ -371,14 +370,14 @@ extension ResponsiveTextField: UIViewRepresentable {
371370

372371
public func textFieldDidBeginEditing(_ textField: UITextField) {
373372
parent.onFirstResponderStateChanged?(true)
374-
firstResponderDemandFulfilled()
373+
parent.resetFirstResponderDemandAfterViewUpdate()
375374
}
376375

377376
public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
378377
if let canResignFirstResponder = parent.onFirstResponderStateChanged?.canResignFirstResponder {
379378
let shouldEndEditing = canResignFirstResponder()
380379
if !shouldEndEditing {
381-
firstResponderDemandFulfilled()
380+
parent.resetFirstResponderDemandAfterViewUpdate()
382381
}
383382
return shouldEndEditing
384383
}
@@ -387,7 +386,7 @@ extension ResponsiveTextField: UIViewRepresentable {
387386

388387
public func textFieldDidEndEditing(_ textField: UITextField) {
389388
parent.onFirstResponderStateChanged?(false)
390-
firstResponderDemandFulfilled()
389+
parent.resetFirstResponderDemandAfterViewUpdate()
391390
}
392391

393392
public func textFieldShouldReturn(_ textField: UITextField) -> Bool {

0 commit comments

Comments
 (0)