2011-12-23 109 views
3

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

我期待在NSTokenFieldDelegateNSTokenFieldCellDelegate的方法,这将允许我拦截并检查令牌上的删除操作。

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

有没有人遇到过这个问题,并发现了一个解决方案,在维护代表对象的基础模型的同时,优雅地删除令牌?

编辑

我发现this为好,这似乎表明,由于某种原因,它只是不喜欢设计我们其他人预期的那样工作。

回答

3

您应该能够通过创建具有指针还给失主令牌包装类以及被包装的对象来模拟删除委托:

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

+0

确实很好! – Roger 2012-04-28 16:14:46

3

我放弃了(在绊倒了6个多小时后)就地使用NSTokenField编辑我的标签的方法。我最终结束了一些易碎的黑客攻击,因为这个功能在不同的地方都需要,所以会影响我的应用程序。

除非有人有强大的观点来反驳我目前的观点,否则NSTokenField是一个丑陋的怪物,带来了一个半熟的实现到党。这是一个遗憾,因为它的演示文稿方面确实吸引我...

编辑:经过一些进一步的实验,我决定在一个合理的可接受的妥协。我在只读模式下使用NSTokenField。它从我的Core Data存储中获取相关标记并将它们显示为标记。我为每个令牌添加了一个菜单,允许用户编辑,删除或查看标签。令牌字段旁边的标准按钮允许添加新标签。编辑和审阅是使用NSPopovers实现的。看到这个例子:

enter image description here

还存在一些小问题:

  • 令牌倾向于在任意时间在令牌字段将鼠标时消失。这似乎是一个错误。
  • 由于令牌字段只接受NSArray的绑定,因此我引入了一个名为tagsAsArray的“虚拟属性”,该虚拟属性接收相关标签并将它们从NSSet转换为NSArray。我认为这会影响KVO,因为标记的编辑只有在按下输入或单击标记字段外部后才会显示。