1

我已经实现了一个 NSTokenField ,它使用一些自定义数据对象来显示动态数据。代表设置良好并显示令牌的正确值。

我还在标记上实现了一个菜单,允许选择用于显示每个标记的格式。但是,我的问题是我无法使 NSTokenField 立即响应这些更改并使用新选择的格式重新绘制令牌。

如果我在 NSTokenField 之外单击,它会退出第一响应者,它会立即重绘。我也可以通过将第一响应者显式设置为 nil 以编程方式执行此操作。唯一的问题是 NSTokenField 失去焦点 - 并在第一响应者选择字段中的所有内容时重新分配它,因此用户可能会意外覆盖整个内容。

所以我的问题是是否有任何方法可以触发 NSTokenField 重绘其内容而不改变焦点和选择?

4

2 回答 2

2

我遇到了同样的问题,发现唯一可行的解​​决方案是每次内容更改时“重置”令牌字段。基本上,这归结为运行视图控制器的以下方法,该方法使用令牌字段处理视图:

- (void) resetTokenField {

    // Force the token field to redraw itself by resetting the represented object.

    id anObject = [self representedObject];
    [self setRepresentedObject: nil];
    [self setRepresentedObject: anObject];
    [[self tokenField] setNeedsDisplay: YES];

}

表示的对象是包含所有正在显示的标记的对象。在我的情况下,这是一大块富文本,其中标记基本上是标签。

我发现NSTokenField这是一种皇家的痛苦,但因为我非常喜欢它的呈现方面,所以我坚持了下来。

编辑:我的令牌字段绑定到tagsAsArray视图控制器的表示对象的方法。所以基本上我使用 Cocoa 绑定来解决这个问题。

于 2012-03-01T01:21:59.917 回答
-1

事实证明,您应该在 NSTokenField 使用的 NSTextView 对象上调用 setNeedsDisplay,而不是在 NSTokenField 本身上调用 setNeedsDisplay。因此以下代码有效:(用 PyObjC 编写)

text_view = token_field.cell().fieldEditorForView_(token_field)
text_view.setNeedsDisplay_(YES)
于 2016-04-04T18:34:40.813 回答