2

我有一个 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 访问选定的令牌?

4

2 回答 2

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]);
    }
}
于 2014-02-20T23:15:45.507 回答
1

而不是使用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)")
    }
}
于 2016-02-23T02:15:14.647 回答