2016-11-22 3 views
0

Если я реализую метод shouldChangeCharactersInRange, существует некоторая несогласованность между значением по диапазону и размером текста. Когда у меня есть текстовое поле с одной общей буквой (например, «a») и нажмите клавишу «назад», текст, подлежащий замене, является пустой строкой, textField.text!.characters.count возвращает 1, а ярость имеет позицию 0 и длину 1 (что все имеет смысл), однако если текстовое поле имеет только эможи (например, «»), range.length возвращает 2, а не 1, а затем я имею сбой при диапазоне отливки от NSRange до Range<String.Index>. Почему это происходит?shouldChangeCharactersInRange дает различный диапазон с emoji

+0

Возможный дубликат [NSRange для диапазона ] (http://stackoverflow.com/questions/ 25138339/nsrange-to-rangestring-index) - Диапазоны строк и NSString различаются, и вы не можете просто «отличать» между ними. –

ответ

1

Swift 3.0+

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    guard let strtext = textField.text else { 
     return true } 

    let completeString = (strtext as NSString).replacingCharacters(in: range, with: string) 
    let increment = string == "" ? 0 : 1 

    let finalString = (completeString as NSString).substring(with: NSRange(location: 0, length: range.location + increment)) 

    print(finalString) 

    return true 
} 

Примечание: - Это будет дает строку с диапазоном STARTINDEX в положение курсора

Смежные вопросы