2014-02-20 5 views
2

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

- (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 

Все, кажется, работает, как я вижу маркеры в не редактируемой TextField.

enter image description here

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

enter image description here

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

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

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

ответ

3

Информация о выборе находится в редакторе полей связанной ячейки 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]); 
    } 
} 
+0

Wonderview, я увидел, что это было возможно с помощью NSTextView получить выбор, но я пропустил ссылку от NSTokenField доступа к NSTextView, fieldEditorForView: это магический метод здесь. Благодаря! Я могу регистрировать выбранные объекты :) –

+1

Он довольно похоронен в документации. Мне потребовалось некоторое время, чтобы найти его. – SSteve

0

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

Heres код в 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)") 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^