2016-01-05 22 views
3

表情符的我有延長UITextView「不能增加endIndex的」 - 錯誤的原因的UITextView

extension UITextView { 

    func separatedWordsInFrontCursor(infront: Bool = true) -> [String] { 

     let cursorPosition = selectedRange.location 
     let separationCharacters = NSCharacterSet(charactersInString: " ") 

     let beginRange = Range(start: text.startIndex.advancedBy(0), end: text.startIndex.advancedBy(cursorPosition)) 
     //fatal error: can not increment endIndex 

     let endRange = Range(start: text.startIndex.advancedBy(cursorPosition), end: text.startIndex.advancedBy(text.characters.count)) 

     let beginPhrase = text.substringWithRange(beginRange) 
     let endPhrase = text.substringWithRange(endRange) 

     return infront ? beginPhrase.componentsSeparatedByCharactersInSet(separationCharacters) : endPhrase.componentsSeparatedByCharactersInSet(separationCharacters) 
    } 
} 

錯誤是如下:

fatal error: can not increment endIndex

這是我嘗試鍵入到UITextViewenter image description here

UITextView的鍵盤類型設置爲Default

當錯誤出現:

cursorPosition is 3 
text.characters.count is 2 
text.startIndex is 0 
text.startIndex.advancedBy(2) is 3 
text.startIndex.advancedBy(cursorPosition) is "fatal error: can not increment endIndex" 

我怎樣才能解決這個?

+3

的問題是,字符串範圍和NSString的範圍是不同的,「不相容」。看看http://stackoverflow.com/questions/25138339/nsrange-to-rangestring-index及其各種解決方案。另一個類似的問題是這樣的:http://stackoverflow.com/questions/27040924/nsrange-from-swift-range。 –

+0

試試這個:let endRange = Range(start:text.startIndex.advancedBy(cursorPosition),end:text.endIndex) – Lumialxk

+0

@Lumialxk致命錯誤屬於'beginRange'行。 –

回答

1

正如@馬丁r表示,我們需要對NSRangeNSString操作,所以該溶液以下:

private func separatedWordsInFrontCursor(infront: Bool = true) -> [String] { 

    let cursorPosition = selectedRange.location 
    let separationCharacters = NSCharacterSet(charactersInString: " ") 

    let nstext = NSString(string: text) 

    let beginRange = NSRange(location: 0, length: cursorPosition) 
    let endRange = NSRange(location: cursorPosition, length: nstext.length - cursorPosition) 

    let beginPhrase = nstext.substringWithRange(beginRange) 
    let endPhrase = nstext.substringWithRange(endRange) 

    return infront ? beginPhrase.componentsSeparatedByCharactersInSet(separationCharacters) : endPhrase.componentsSeparatedByCharactersInSet(separationCharacters) 
} 
+0

我發現你得到這個的原因。因爲text.startIndex.advanceBy()返回一個錯誤的值與emoji.I明天會發布我的代碼,現在我很困。 – Lumialxk

+0

@Lumialxk我很高興看到:) –