【问题标题】:Resizing NSTokenField after populating with tokens填充令牌后调整 NSTokenField 的大小
【发布时间】:2015-12-13 01:18:00
【问题描述】:

我使用 NSTokenField 作为用户输入标签的一种方式。一切正常,当用户添加或删除标签时,它与 CoreData 连接管理标签。

我最近添加了逻辑,以便 NSTokenField 在用户添加标签时垂直调整大小,并使用 Andrew Bowman 的 IFVerticallyExpandingTextField 中断到下一行。同样,这一切都很好。

问题是,当我最初必须使用标签填充 NSTokenField 时,我需要调整它的大小。我通过调用填充该字段:

[tagField setObjectValue: anArray];

其中 anArray 是表示标签或令牌的一系列对象。这又调用了 NSTokenField 委托方法

tokenField:displayStringForRepresentedObject:

返回前一个数组中传递的对象的字符串表示形式。

在调用 displayStringForRepresentedObject 之后,我需要调整 NSTokenField 的大小。有没有人有任何关于通知或发现它已经完成的方法的想法?即使是在每次调用 displayStringForRepresentedObject 之间调用调整大小的方法也可能有效。

提前致谢。

【问题讨论】:

  • 您的自动调整大小是否适用于自动布局?

标签: objective-c cocoa macos appkit nstokenfield


【解决方案1】:

您可以尝试类似于 -setNeedsDisplay: 和 -displayIfNeeded ... 即 -setNeedsSizeToFit: 和 -sizeToFitIfNeeded。

您只需要一个 "needsSizeToFit" BOOL 标志和 -setNeedsSizeToFit: 和 -sizeToFitIfNeeded 方法。

设置令牌后,调用 -setNeedsSizeToFit:YES。它又会设置实例的 needsSizeToFit 标志,然后如果标志为 YES,它将调用 [self performSelector:@selector(sizeToFitIfNeeded) withObject:nil afterDelay:0]。您的 -sizeToFitIfNeeded 方法将检查您的 needsSizeToFit 标志是否为 YES,调用 [self sizeToFit],然后将 needsSizeToFit 标志设置为 NO。

更新

这里是a complete class (JLNAutoSizingTokenField),它执行如上所述的基本自动调整大小。唯一的增强是在上述委托方法中调用它:

- (NSString *)tokenField:(NSTokenField *)aTokenField 
displayStringForRepresentedObject:(id)representedObject
{
    [(JLNAutoSizingTokenField *)aTokenField setNeedsSizeToFit:YES];
    return representedObject;
}

【讨论】:

  • 我开始做类似的事情,但我遇到了不知道我的所有令牌何时设置的问题。这就是我遇到的真正问题。在我 setObjectValue 之后没有设置它们。它们仅在调用每个 displayStringForRepresentedObject 后设置。
  • 不会 -displayStringForRepresentedObject: 在与您的 -setObjectValue: 调用相同的运行循环中被调用吗?如果是这样,那么 -sizeToFitIfNeeded 将在下一次运行循环中调用,所有调用 -displayStringForRepresentedObject:.
  • 最坏的情况:每次调用 -displayStringForRepresentedObject: 时都会调用 -setNeedsSizeToFit: 看起来不好看但功能正常。
  • setObjectValue 被调用一次,然后 NSTokenField 为 objectValue 中的每个对象调用 displayString。我必须再次尝试在 diplayStringForRepresentedObject 中调用 resize 方法,因为当我尝试这样做之前,它会弄乱字符串本身。令牌字段不喜欢我在做它需要做的事情时调用 resize 方法。
  • 真正令人讨厌的是,我还没有尝试过,每次调用 displayStringForRepresentedObject 时调用一个方法并确定它是否要显示最后一个。那时调用 resize 方法,延迟为 0.1 或其他东西。从 displayStringForRepresentedObject 调用 resize 很奇怪,因为它返回一个字符串。所以我在它返回字符串之前调用resize,然后最终会得到一个没有考虑到的字符串。
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
相关资源
最近更新 更多