【问题标题】:NSTokenField selected tokenNSTokenField 选择的令牌
【发布时间】:2014-02-20 00:06:51
【问题描述】:

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

【问题讨论】:

    标签: objective-c nstokenfield


    【解决方案1】:

    选择信息在 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]);
        }
    }
    

    【讨论】:

    • Wonderview,我看到可以通过 NSTextView 获取选择,但我错过了从 NSTokenField 访问 NSTextView 的链接,fieldEditorForView: 是这里的神奇方法。谢谢!我能够记录选定的对象:)
    • 它隐藏在文档中。我花了一段时间才找到它。
    【解决方案2】:

    我发现使用 NSTextField 委托方法 textViewDidChangeSelection 比使用 mouseDown(_:) 更好。

    这是 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)")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2011-09-15
      • 1970-01-01
      相关资源
      最近更新 更多