在使用标记填充后调整NSTokenField的大小

时间:2010-09-17 13:38:04

标签: objective-c cocoa macos appkit nstokenfield

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

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

问题在于,当我必须首先用标签填充NSTokenField时,我需要它来调整大小。我通过调用:

来填充该字段
[tagField setObjectValue: anArray];

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

tokenField:displayStringForRepresentedObject:

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

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

提前致谢。

1 个答案:

答案 0 :(得分: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。

<强>更新

这是a complete class (JLNAutoSizingTokenField),如上所述进行基本的自动调整。唯一的补充是在前面提到的委托方法中称之为:

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