我正在使用NSTokenField作为用户输入标签的方式。一切工作正常,并且在用户添加或删除标签时,都可以通过CoreData管理标签。

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

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

[tagField setObjectValue: anArray];


其中anArray是代表标签或令牌的一系列对象。依次调用NSTokenField委托方法

tokenField:displayStringForRepresentedObject:


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

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

提前致谢。

最佳答案

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

07-27 19:09