Skip to content

Commit f23c1b0

Browse files
committed
Text input customization point allowing to ignore typed text
1 parent 8ee8b5a commit f23c1b0

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

MessageViewController/MessageAutocompleteController.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ public final class MessageAutocompleteController: MessageTextViewListener {
233233
preserveTypingAttributes(for: textView)
234234
}
235235

236-
public func willChangeRange(textView: MessageTextView, to range: NSRange) {
236+
public func willChangeText(textView: MessageTextView, inRange range: NSRange, to: String) -> Bool {
237237

238238
// range.length == 1: Remove single character
239239
// range.lowerBound < textView.selectedRange.lowerBound: Ignore trying to delete
@@ -261,6 +261,7 @@ public final class MessageAutocompleteController: MessageTextViewListener {
261261
})
262262
}
263263
}
264+
return true
264265
}
265266

266267
}

MessageViewController/MessageTextView.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import UIKit
1010
public protocol MessageTextViewListener: class {
1111
func didChange(textView: MessageTextView)
1212
func didChangeSelection(textView: MessageTextView)
13-
func willChangeRange(textView: MessageTextView, to range: NSRange)
13+
func willChangeText(textView: MessageTextView, inRange: NSRange, to: String) -> Bool
1414
}
1515

1616
open class MessageTextView: UITextView, UITextViewDelegate {
@@ -134,8 +134,13 @@ open class MessageTextView: UITextView, UITextViewDelegate {
134134
}
135135

136136
public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
137-
enumerateListeners { $0.willChangeRange(textView: self, to: range) }
138-
return true
137+
// If listener changes text then subsequent listeners will probably get incorrect affected range
138+
// and text as they were changed by previous listener. So be careful playing with textView
139+
var shouldChange = true
140+
// if at least one listener changes text and needs to ignore typed text then this method returns
141+
// that just typed text needs to be ignored
142+
enumerateListeners { shouldChange = shouldChange && $0.willChangeText(textView: self, inRange: range, to: text) }
143+
return shouldChange
139144
}
140145

141146
}

MessageViewController/MessageView.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ public final class MessageView: UIView, MessageTextViewListener {
336336
delegate?.selectionDidChange(messageView: self)
337337
}
338338

339-
public func willChangeRange(textView: MessageTextView, to range: NSRange) {}
339+
public func willChangeText(textView: MessageTextView, inRange: NSRange, to: String) -> Bool {
340+
return true
341+
}
340342

341343
}

0 commit comments

Comments
 (0)