gpt4 book ai didi

cocoa - NSTokenField 和删除标记

转载 作者:行者123 更新时间:2023-12-03 16:13:16 24 4
gpt4 key购买 nike

我的应用程序允许用户将标签附加到某些模型对象(NSManagedObject 的子类)。 Tag 类也是 NSManagedObject 的子类。我决定使用 NSTokenField 来显示标签,其中每个 token 都保存一个 Tag 实例作为表示的对象。这一切都工作得很好,但我陷入了用户删除 token 的情况,因为我想检查关联的标签是否已过时并应删除。

我期待 NSTokenFieldDelegateNSTokenFieldCellDelegate 中的方法允许我拦截并检查 token 上的删除操作。

经过一番谷歌搜索后,我发现 this post谈到主题。我在 Controller ( token 字段的委托(delegate))中实现了建议的方法 controlTextDidChange:。检查作为参数传递的控件后,发现它是 NSTokenTextView 的一个实例,我找不到任何文档(可能是私有(private)类)。

有人遇到过这个问题并找到了一种解决方案来优雅地删除 token ,同时维护所表示对象的底层模型吗?

编辑

我找到了this同样,这似乎表明,由于某种原因,它的设计并不像我们其他人期望的那样工作。

最佳答案

您应该能够通过创建一个 token 包装类来模拟删除委托(delegate),该类具有返回所有者以及包装对象的指针:

@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 通知所有者 token 已被删除:

@implementation TokenWrapper

...

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

@end

然后在您的 representedObjectForEditingString 回调中,返回一个指向您的所有者和真实 token 的自动释放的包装器。您还必须确保更改其他 NSTokenField 委托(delegate)回调以深入研究包装器对象。当您手动更改 NSTokenField 的内容(例如通过调用 setObjectValue)时,请确保所有者进行一些设置以忽略这些回调。

关于cocoa - NSTokenField 和删除标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com