Меня пытались обнаружить backspace внутри UITextfieldDelegate. И нашел этот ответ. https://stackoverflow.com/a/49294870/911528
И это работает правильно.
Но я не знаю, что происходит внутри этой функции.
let char = string.cString(using: String.Encoding.utf8)!
let isBackSpace = strcmp(char, "\\b")
if isBackSpace == -92 {
print("Backspace was pressed")
return false
}
- Я не знаю, почему результат cString возврата равен 0. Я могу отлаживать XCode. Пожалуйста, проверьте скриншот.
- Я не знаю, почему strcmp около 0 для возврата (насколько я получил это значение в отладчике XCode), а символ "\ b" возвращает -92
Я знал, что код ascii backspace равен «8» типа int, поэтому я подумал, что вышеприведенная функция будет похожа на этот код ниже.
// I thought this char would be "\b" of type char or 08 of type int
// but XCode give the value 0... I don't know why
let char = string.cString(using: String.Encoding.utf8)!
// as far as I know, strcmp returns positive value for equal values.
let isBackSpace = strcmp(char, "\\b")
// so I thought this would be
if isBackSpace > 0 {
print("Backspace was pressed")
return false // or true
}
Кто-нибудь может объяснить этот код шаг за шагом? Спасибо.
ссылка:
https://linux.die.net/man/3/strcmp
https://theasciicode.com.ar/ascii-control-characters/backspace-ascii-code-8.html
Теперь я могу понять, почему люди используют этот код, а приведенный выше код неверен.
Попробуйте правильно отредактировать, обратившись к ответу @Cristic.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// backspace checking
if string == "" {
return true // or false
}