3

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

あるいは、メニューがなくてもトークンフィールドに文字列を完成させる別の方法を知っている人はいますか?

4

0 に答える 0