Skip to content

Commit f359405

Browse files
viktoraslrnystrom
authored andcommitted
Input customization point (#54)
* Text input customization point allowing to ignore typed text * After autocompleted text is removed preceding character is not removed
1 parent d985cf5 commit f359405

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

Diff for: MessageViewController/MessageAutocompleteController.swift

+5-1
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
@@ -248,6 +248,7 @@ public final class MessageAutocompleteController: MessageTextViewListener {
248248
if let isAutocomplete = attribute[NSAttributedAutocompleteKey] as? Bool, isAutocomplete {
249249
// Remove the autocompleted substring
250250
let lowerRange = NSRange(location: 0, length: range.location + 1)
251+
var shouldPreserveTypedText = true
251252
textView.attributedText.enumerateAttribute(NSAttributedAutocompleteKey, in: lowerRange, options: .reverse, using: { (_, range, stop) in
252253

253254
// Only delete the first found range
@@ -258,9 +259,12 @@ public final class MessageAutocompleteController: MessageTextViewListener {
258259
textView.selectedRange = NSRange(location: range.location, length: 0)
259260
self.textView.textViewDidChange(textView)
260261
self.preserveTypingAttributes(for: textView)
262+
shouldPreserveTypedText = false
261263
})
264+
return shouldPreserveTypedText
262265
}
263266
}
267+
return true
264268
}
265269

266270
}

Diff for: MessageViewController/MessageTextView.swift

+8-3
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
}

Diff for: MessageViewController/MessageView.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,8 @@ public final class MessageView: UIView, MessageTextViewListener {
361361
delegate?.selectionDidChange(messageView: self)
362362
}
363363

364-
public func willChangeRange(textView: MessageTextView, to range: NSRange) {}
364+
public func willChangeText(textView: MessageTextView, inRange: NSRange, to: String) -> Bool {
365+
return true
366+
}
365367

366368
}

0 commit comments

Comments
 (0)