NSTokenFieldをサブクラス化して、トークンの提案を含むポップオーバーを表示しようとしています。
サブクラスをスーパーデリゲートとして設定し、– tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:
デリゲートメソッドをインターセプトし、メニューが表示されないようにnilを返します。トークンフィールドがユーザーによって入力された文字列を完了しないnilを返すことを除いて、正常に機能します。
現在– tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:
、提案された文字列を追加するために次の行を使用しています。
NSText *editingText = [[self window] fieldEditor:NO forObject:self];
NSString *suggestionString = [filteredStrings objectAtIndex:0];
NSString *missingPart = [(NSString *)suggestionString substringFromIndex:[substring length]];
NSUInteger insertionPoint = [editingText selectedRange].location;
NSMutableString *currentStringPlusSuggestionString = [[editingText string] mutableCopy];
[currentStringPlusSuggestionString insertString:missingPart atIndex:insertionPoint];
[editingText setString:[stringWithSuggestionString copy]];
残念ながら、2つのトークンの間にテキストを挿入しようとするとエラーが発生します。ここにエラーがありますが、文字列が範囲外である理由がよくわかりません。
[NSBigMutableString _getBlockStart:end:contentsEnd:forRange:stopAtLineSeparators:]: Range or index out of bounds'
0 CoreFoundation 0x00007fff88835716 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8adae470 objc_exception_throw + 43
2 CoreFoundation 0x00007fff888354ec +[NSException raise:format:] + 204
3 Foundation 0x00007fff8efd6627 -[NSString _getBlockStart:end:contentsEnd:forRange:stopAtLineSeparators:] + 157
4 AppKit 0x00007fff8bd37c6f _NSFastFillAllLayoutHolesForGlyphRange + 285
5 AppKit 0x00007fff8bd008fa -[NSLayoutManager textContainerForGlyphAtIndex:effectiveRange:] + 238
6 AppKit 0x00007fff8bb4a18f -[NSTextView(NSSharing) didChangeText] + 194
7 AppKit 0x00007fff8bbe00ee -[NSTokenFieldCell textView:willChangeSelectionFromCharacterRange:toCharacterRange:] + 776
8 AppKit 0x00007fff8bd32795 -[NSControl textView:willChangeSelectionFromCharacterRange:toCharacterRange:] + 112
9 AppKit 0x00007fff8bd30724 -[NSTextView(NSSharing) setSelectedRanges:affinity:stillSelecting:] + 1076
10 AppKit 0x00007fff8bcf8438 -[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 406
11 AppKit 0x00007fff8bcf828a -[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 154
12 AppKit 0x00007fff8bda0f75 -[NSTextStorage processEditing] + 202
13 AppKit 0x00007fff8bc02c54 -[NSTextStorage endEditing] + 79
14 PopoverTokenField 0x0000000100002f55 -[JSTokenField tokenField:completionsForSubstring:indexOfToken:indexOfSelectedItem:] + 1013
あるいは、メニューがなくてもトークンフィールドに文字列を完成させる別の方法を知っている人はいますか?