【问题标题】:Updating NSTokenField after changing content programmatically以编程方式更改内容后更新 NSTokenField
【发布时间】:2016-04-05 02:34:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: cocoa nstokenfield


    【解决方案1】:

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

    - (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 绑定来解决问题。

    【讨论】:

    • 谢谢,我会在今天晚些时候试一试您的建议。完全同意你的 Royal PITA ;)
    • 刚刚检查了您的解决方案,结果发现 [tokenField setRepresentedObject:nil];与关闭再打开响应具有相同的副作用 - 即选择整个令牌字段。
    • 根据您的解决方案找到了一种解决方法:[tokenField setObjectValue:[NSArray arrayWithArray:[tokenField objectValue]]];似乎在新数组中设置相同的值会触发令牌的重绘,而不会产生选择副作用。 Apple 应该为其提供更清洁的解决方案,这有点肮脏 - 但无论如何我会接受你的回答,因为它会引导我找到一个可以接受的解决方案。
    【解决方案2】:

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

    text_view = token_field.cell().fieldEditorForView_(token_field)
    text_view.setNeedsDisplay_(YES)
    

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多