我有一个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的representObject时,我得到了一个空引用。
任何人都知道我们如何从NSTokenField访问所选的令牌?
答案 0 :(得分: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]);
}
}
答案 1 :(得分: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)")
}
}