2011-12-23 105 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,因爲標記的編輯只有在按下輸入或單擊標記字段外部後纔會顯示。