2016-11-22 66 views
0

如果我實現方法shouldChangeCharactersInRange,則範圍值和文本大小之間會有某種不一致。 當我只有一個常用字母的文本框(如「a」)並按退格鍵時,要替換的文本是一個空字符串,textField.text!.characters.count返回1,而憤怒的位置爲0和長度爲1(這一切都有意義),但是如果文本字段只有一個表情符號(如「」),則range.length返回2而不是1,然後在投射範圍從NSRangeRange<String.Index>時發生崩潰。爲什麼會發生?shouldChangeCharactersInRange給出與表情符號不同的範圍

+0

的可能的複製[NSRange到範圍](http://stackoverflow.com/questions/ 25138339/nsrange-to-rangestring-index) - 字符串和NSString範圍不同,並且不能簡單地在它們之間「投射」。 –

回答

1

斯威夫特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到光標位置