2010-12-05 71 views
0

我有一个NSTokenField与NSTokenFieldCell的代表托管对象。当我键入以下命令创建一个新的NSTokenFieldCell,我NSTokenField的委托(一个NSArrayController)叫回用这种方法:回调删除NSTokenFieldCell

tokenField:representedObjectForEditingString 

在这种方法中,我创建了新的令牌单元的管理对象,它按预期工作。

但是,我找不到一个回调方法来删除NSTokenFieldCell,我可以删除我的托管对象。任何人都知道这是否存在?如果没有,我想我必须以某种方式监视NSTokenField的删除,这听起来不太理想。

回答

1

很难理解你要求的内容。你真的想要创建和删除NSTokenFieldCells吗?我不认为你这样做 - 一个NSTokenField控件有一个NSTokenFieldCell实例。整个程序集只是将某些字符串(通过NSTokenFieldDelegate协议控制)表示为图形“标记”。该单元格不是每次都重新创建,而只是它表示/绘制的内容。

你的意思是说当你从字段中删除一个标记字符串时,你想要得到通知吗?如果是这样,恐怕这不是它设计的工作方式。 决定什么字符串(由您告知要使用的标记字段的标记字符集分隔)被标记,以及什么替换字符串(通常是缩短或清除的版本)显示为标记本身。因此,您最多可以来确定模型中的“标记”是否已丢失并自行清理。

简单地说:在Cocoa Bindings中没有这样做的设施。最好维护一个“-tokensNeedCleaning”标志并将其与-setNeedsDisplay:和-displayIfNeeded方法与NSView一起使用。这样,当令牌字段被编辑时,您可以调用[self setTokensNeedCleaning:YES]。反过来,该方法可以通过-performSelector:withObject:afterDelay :(带有零秒延迟)调用“[self cleanTokensIfNeeded]”,以在需要清除标志为YES时安排清理丢失的标记。然后它会解除国旗。

这个简单的机制保持清理例程不会在每次连续编辑时运行,而是标记它并安排它在不久的将来运行,如果它仍然需要的话。这样,对-cleanTokensIfNeeded的连续预定呼叫将不会盲目地尝试清理 - 清理呼叫将被合并。

+0

对不起,我感到困惑。假设我想在从字段中删除标记字符串时收到通知,这是正确的。您的TokensNeedCleaning标志设置听起来像是一个合理的解决方案。 但是我遇到了一个新问题。为了确定哪些标记字符串已被删除,我需要将保存的值与表单值进行比较。当我通过在我的NSTokenField上调用objectValue来获取我的表单值时,它的委托被发送tokenField:representObjectForEditingString:它被设置为保存一个新的标记。 – tassock 2010-12-06 07:26:35

+0

我发现objectValue不会触发tokenField :representObjectForEditingString:如果在textDidEndEditing中调用。我为我的NSTokenField设置了创建和删除功能。感谢您的指导! – tassock 2010-12-06 09:47:32

0

我只是在另一个话题回答了这个问题,一个似乎是死了,所以我会在这里回答:

您应该能够通过创建具有指针令牌包装类模拟删除委托回所有者以及被包装的对象:

@protocol TokenWrapperDelegate 
-(void)tokenWasDeleted:(id)token; 
@end 

@interface TokenWrapper : NSObject { 
    id<TokenWrapperDelegate> owner; 
    id token; 
} 
-(id)initWithWrappedToken:(id)token owner:(id<TokenWrapperDelegate>)owner; 
@property (nonatomic, weak) id<TokenWrapperDelegate> owner; 
@property (nonatomic, strong) id token; 
@end 

然后让TokenWrapper的dealloc通知车主令牌被删除:

@implementation TokenWrapper 

... 

-(void)dealloc { 
    [owner tokenWasDeleted:self.token]; 
    self.token = nil; 
    [super dealloc]; 
} 

@end 

然后在你的representedObjectForEditingString回调中,返回一个自动发布的包装器,指向你的所有者和你的真实令牌。您还必须确保更改其他NSTokenField委托回调来深入了解包装器对象。 当您手动更改NSTokenField的内容时(比如通过调用setObjectValue),确保所有者设置了一些忽略这些回调的位。