NSTokenField выбранный токен

Я получил NSTokenField, где я устанавливаю токены через setObjectValue:[NSArray ..] с пользовательскими объектами. Я реализую общие методы NSTokenFieldDelegate:

- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)_tokens atIndex:(NSUInteger)index
- (NSString *)tokenField:(NSTokenField *)tokenField displayStringForRepresentedObject:(id)representedObject
- (NSTokenStyle)tokenField:(NSTokenField *)tokenField styleForRepresentedObject:(id)representedObject
- (BOOL)tokenField:(NSTokenField *)tokenField hasMenuForRepresentedObject:(id)representedObject
- (NSMenu *)tokenField:(NSTokenField *)tokenField menuForRepresentedObject:(id)representedObject
- (BOOL)tokenField:(NSTokenField *)tokenField writeRepresentedObjects:(NSArray *)objects toPasteboard:(NSPasteboard *)pboard
- (NSArray *)tokenField:(NSTokenField *)tokenField readFromPasteboard:(NSPasteboard *)pboard

Кажется, все работает, когда я вижу токены в нередактируемом текстовом поле.

Поскольку это текстовое поле (не редактируемое), пользователь может выбирать текст (в данном случае токены). Когда пользователь нажимает на токен, он помечается как выбранный.

Теперь я пытаюсь найти выбранный токен (после нажатия кнопки мыши), но мне кажется, что я не могу получить к нему доступ ни из NSTokenField, ни из NSTextField, ни из NSControl.

Я пытаюсь использовать tokenField.selectedCell, который дает мне NSTokenFieldCell: 0x6000001c2b20, объект не изменяется при моем выборе. Когда я спрашиваю представленный объект selectedCell, я получаю нулевую ссылку.

Кто-нибудь понял, как мы можем получить доступ к выбранному токену из NSTokenField?

2 ответа

Решение

Информация о выборе находится в редакторе полей связанной ячейки NSTokenField. В этом фрагменте кода будут напечатаны токены, выбранные в self.tokenField на консоль:

NSArray *objects = [self.tokenField objectValue];
NSTextView *tv = [[self.tokenField cell] fieldEditorForView:self.tokenField];
NSArray *selections =[tv selectedRanges];

for (NSValue *rangeVal in selections) {
    NSRange range = [rangeVal rangeValue];
    for (NSUInteger i=0; i<range.length; i++) {
        NSLog(@"%@", [objects objectAtIndex:range.location + i]);
    }
}

Вместо того, чтобы использовать mouseDown(_:) Я нашел, что лучше использовать метод делегата NSTextField textViewDidChangeSelection,

Вот код в Swift.

public func textViewDidChangeSelection(notification: NSNotification) {

    if let fieldView = tokenField.cell!.fieldEditorForView(self) {

        var selectedObjects = [AnyObject]()

        for value in fieldView.selectedRanges {    
            let range = value.rangeValue

            for var i = 0 ; i < range.length ; i++ {
                selectedObjects.append(tokenField.objectValue!.objectAtIndex(range.location + i))
            }
        }
        Swift.print("selected objects:\(selectedObjects)")
    }
}
Другие вопросы по тегам