2016-09-25 12 views
0

UITextViewからタイプされている単語を取得しようとしています。私はここに別の答えは見つかりtextViewDidChange(_:)に配置された次のコードを持っているが、それは絵文字のために動作しません:編集したUITextViewの単語を取得

func editedWord() -> String { 
    let cursorPosition = selectedRange.location 
    let separationCharacters = CharacterSet(charactersIn: " ") 

    // Count how many actual characters there are before the cursor. 
    // Emojis/special characters can each increase selectedRange.location 
    // by 2 instead of 1 

    var unitCount = 0 
    var characters = 0 
    while unitCount < cursorPosition { 
     let char = text.index(text.startIndex, offsetBy: characters) 
     let int = text.rangeOfComposedCharacterSequence(at: char) // Crashes here when there's an emoji. 
     unitCount = text.distance(from: text.startIndex, to: int.upperBound) 
     characters += 1 
    } 

    let beginRange = Range(uncheckedBounds: (lower: text.index(text.startIndex, offsetBy: 0), upper: text.index(text.startIndex, offsetBy: characters))) 
    let endRange = Range(uncheckedBounds: (lower: text.index(text.startIndex, offsetBy: characters), upper: text.index(text.startIndex, offsetBy: text.characters.count))) 


    let beginPhrase = text.substring(with: beginRange) 
    let endPhrase = text.substring(with: endRange) 

    let beginWords = beginPhrase.components(separatedBy: separationCharacters) 
    let endWords = endPhrase.components(separatedBy: separationCharacters) 

    return beginWords.last! + endWords.first! 
} 

は、私はそれは、whileループ内でクラッシュするという立場を示してきたが、クラッシュは、 "インデックスXは無効です"と言います。これをどうすれば解決できますか?

答えて

0

文字列から最後の単語を取得する必要があります。それを取得するコードは次のとおりです。

__block NSString *lastWord = nil; 

[someNSStringHere enumerateSubstringsInRange:NSMakeRange(0, [someNSStringHere length]) options:NSStringEnumerationByWords | NSStringEnumerationReverse usingBlock:^(NSString *substring, NSRange subrange, NSRange enclosingRange, BOOL *stop) { 

    lastWord = substring; 
    *stop = YES; 
}]; 

希望します。

+0

OPはSwiftを使用しています。スウィフトコードを使用して回答する必要があります。 –

+0

これはemojisでは機能しません。入力された最後の単語のみが表示されます。カーソルが現在オンになっていることも覚えておいてください。そして、ええ、迅速。 – Tometoyou

関連する問題