4

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

我期待一种方法,NSTokenFieldDelegate或者NSTokenFieldCellDelegate允许我拦截并检查令牌上的删除操作。

经过一番谷歌搜索后,我发现这篇文章解决了这个话题。controlTextDidChange:我在我的控制器(令牌字段的委托)中实现了建议的方法。在检查作为参数传递的控件时,它显示NSTokenTextView为我找不到任何文档的实例(可能是私有类)。

有没有人遇到过这个问题并找到了一个解决方案来优雅地删除标记,同时保持表示对象的底层模型?

编辑

我也发现了这一点,这似乎表明出于某种原因,它的设计目的并不像我们其他人所期望的那样工作。

4

2 回答 2

4

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

@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)时,请确保所有者设置一些忽略这些回调。

于 2012-02-29T19:32:54.367 回答
3

在使用 NSTokenField 就地编辑我的标签的方法上,我放弃了(在跌跌撞撞了 6 个多小时之后)。我最终得到了一些脆弱的黑客攻击,这些黑客攻击会波及我的应用程序,因为在不同的地方都需要这个特性。

除非有人有一些强项来反驳我目前的观点,否则 NSTokenField 是一个丑陋的怪物,给聚会带来了半生不熟的实现。这是一个耻辱,因为它的演示方面真的很吸引我......

编辑:经过一些进一步的实验,我确定了一个可以接受的折衷方案。我在只读模式下使用 NSTokenField。它从我的核心数据存储中获取相关标签并将它们显示为令牌。我为每个令牌添加了一个菜单,允许用户编辑、删除或查看标签。令牌字段旁边的标准按钮允许添加新标签。编辑和审查是使用 NSPopovers 实现的。看这个例子:

在此处输入图像描述

还有一些小问题:

  • 将鼠标悬停在令牌字段上时,令牌往往会在任意时间消失。这似乎是一个错误。
  • 由于令牌字段仅接受 NSArray 进行绑定,因此我引入了一个名为“虚拟属性” tagsAsArray,它采用关联的标签并将它们从 NSSet 转换为 NSArray。我认为这会影响 KVO,因为标签的编辑仅在按下回车键或在令牌字段外单击后才会显示。
于 2011-12-24T19:09:04.063 回答