I'm trying to autocomplete emails. I've done the autocomplete part, but I want to use some properties in strings. For example, after typing the user's e-mail address and making @g, I want to show a different background color of the mail.com section. Then when the user presses m I want to make this background color white again. Below are the codes I have written so far. Is there anyone who can help?
let suggestionsArray = ["gmail.com", "hotmail.com", "outlook.com"]
private func autoComplete(str: String) -> Bool {
if let text = textField.text {
let control = text.components(separatedBy: "@")
if control.count > 1 {
var newText = control[0] + "@"
var autoCompleteFinished: Bool = false
let numberOfCharacters: Int = control[1].count + 1
suggestionsArray.forEach({ suggestion in
if autoCompleteFinished { return }
if suggestion.prefix(numberOfCharacters) == (control[1] + str) {
autoCompleteFinished = true
newText = newText + suggestion
let colouredString: NSMutableAttributedString = NSMutableAttributedString(string: newText)
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
colouredString.addAttribute(NSAttributedStringKey.backgroundColor, value: UIColor.ubYellow, range: NSRange(location: cursorPosition + 1 ,length:suggestion.count-numberOfCharacters))
}
self.textField.attributedText = colouredString
//textField.text = newText
if newText.hasSuffix(suggestion) {
if let selectedRange = textField.selectedTextRange {
if let newPosition = textField.position(from: selectedRange.start, offset: -(suggestion.count-numberOfCharacters)) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
}
}
})
return autoCompleteFinished
}
}
return false
}
private func characterAfterCursor() -> String? {
if let cursorRange = textField.selectedTextRange {
if let newPosition = textField.position(from: cursorRange.start, offset: 1) {
let range = textField.textRange(from: newPosition, to: cursorRange.start)
return textField.text(in: range!)
}
}
return nil
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let ftype = self.fType {
switch ftype {
case .email, .emailNoImage:
if string == characterAfterCursor() {
if let selectedRange = textField.selectedTextRange {
if let newPosition = textField.position(from: selectedRange.start, offset: 1) {
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}
}
return false
}
if string != characterAfterCursor() {
var lastString: Int
if let selectedRange = textField.selectedTextRange {
let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)
lastString = textField.text!.count - cursorPosition
textField.text?.removeLast(lastString)
}
}
if string != "" {
return !autoComplete(str: string)
}
break
default:
break
}
}```