我有一个包含NSTokenFieldCell的NSTokenField,用于表示托管对象。当我通过输入创建一个新的NSTokenFieldCell时,我的NSTokenField的委托(一个NSArrayController)被这个方法回调:
tokenField:representedObjectForEditingString在此方法中,我为新的标记单元格创建了一个托管对象,它按预期工作。
但是,我找不到一个用于删除NSTokenFieldCell的回调方法,在该方法中我可以删除我的托管对象。有人知道这是否存在吗?如果不是,我想我将不得不以某种方式监视NSTokenField的删除,这听起来不太理想。
发布于 2010-12-06 05:33:03
很难理解你到底想要什么。你是说你在创建和删除NSTokenFieldCells吗?我不这么认为-- NSTokenField控件有一个NSTokenFieldCell实例。整个程序集只是将某些字符串(通过NSTokenFieldDelegate协议控制)表示为图形“令牌”。不是每次都重新创建单元格,而是只重新创建它表示/绘制的内容。
你的意思是说,当一个标记化的字符串从字段中删除时,你希望得到通知?如果是这样的话,恐怕这不是它设计的工作方式。您可以决定将哪些字符串(由您告诉token字段使用的标记化字符集分隔)以及哪些替换字符串(通常是缩短或清理后的版本)显示为令牌本身。因此,由您决定模型中的"token“现在是否丢失,并自行清理。
简单地说:在Cocoa绑定中没有这样做的工具。最好维护一个"-tokensNeedCleaning“标志,并以-setNeedsDisplay:和-displayIfNeeded方法处理NSView的方式对待它。这样,当token字段被编辑时,您可以调用self setTokensNeedCleaning:YES。反过来,该方法可以通过-performSelector:withObject:afterDelay:调用"self cleanTokensIfNeeded“(延迟为零秒),以便在needsCleaning标志为YES的情况下调度清除丢失的令牌。然后,它将取消设置该标志。
这个简单的机制使清理例程不会在每次后续编辑时运行,而是标记它,并安排它在不久的将来运行(如果仍然需要)。这样,对-cleanTokensIfNeeded的连续调度调用将不会盲目地尝试清理-清理调用将被合并。
发布于 2012-03-02 04:28:25
我刚刚在另一个话题中回答了这个问题,那个话题似乎已经死了,所以我在这里回答:
您应该能够通过创建一个令牌包装器类来模拟delete委托,该类具有指向所有者的指针以及包装的对象:
@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取消分配通知所有者该令牌已被删除:
@implementation TokenWrapper
...
-(void)dealloc {
[owner tokenWasDeleted:self.token];
self.token = nil;
[super dealloc];
}
@end然后在您的representedObjectForEditingString回调中,返回一个自动释放的包装器,指向您的所有者和您的真实令牌。您还必须确保更改其他NSTokenField委托回调以深入研究包装器对象。确保所有者在手动更改NSTokenField的内容(如通过调用setObjectValue)时忽略这些回调。
https://stackoverflow.com/questions/4357624
复制相似问题