2014-02-20 58 views
2

我得到了一個N​​STokenField,我通過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 

一切似乎是工作,因爲我看到了令牌在沒有編輯的文本字段。

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

繼承人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)") 
    } 
}