Выбранный токен 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?


person Jelle De Laender    schedule 20.02.2014    source источник


Ответы (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]);
    }
}
person SSteve    schedule 20.02.2014
comment
Wonderview, я видел, что через NSTextView можно получить выбор, но я пропустил ссылку из NSTokenField для доступа к NSTextView, fieldEditorForView: это волшебный метод здесь. Спасибо! Я могу регистрировать выбранные объекты :) - person Jelle De Laender; 21.02.2014
comment
Это довольно похоронено в документации. Мне потребовалось некоторое время, чтобы найти его. - person SSteve; 21.02.2014

Вместо использования 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)")
    }
}
person Chris    schedule 23.02.2016