2

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

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

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

[tagField setObjectValue: anArray];

其中 anArray 是代表标签或 Token 的一系列对象。这反过来调用 NSTokenField 委托方法

tokenField:displayStringForRepresentedObject:

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

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

提前致谢。

4

1 回答 1

0

您可以尝试类似于 -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。

更新

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

- (NSString *)tokenField:(NSTokenField *)aTokenField 
displayStringForRepresentedObject:(id)representedObject
{
    [(JLNAutoSizingTokenField *)aTokenField setNeedsSizeToFit:YES];
    return representedObject;
}
于 2010-09-17T14:27:53.220 回答