2010-12-05 70 views
0

我有一個NSTokenField與NSTokenFieldCell的代表託管對象。當我鍵入以下命令創建一個新的NSTokenFieldCell,我NSTokenField的委託(一個NSArrayController)叫回用這種方法:回調刪除NSTokenFieldCell

tokenField:representedObjectForEditingString 

在這種方法中,我創建了新的令牌單元的管理對象,它按預期工作。

但是,我找不到一個回調方法來刪除NSTokenFieldCell,我可以刪除我的託管對象。任何人都知道這是否存在?如果沒有,我想我必須以某種方式監視NSTokenField的刪除,這聽起來不太理想。

回答

1

很難理解你要求的內容。你真的想要創建和刪除NSTokenFieldCells嗎?我不認爲你這樣做 - 一個NSTokenField控件有一個NSTokenFieldCell實例。整個程序集只是將某些字符串(通過NSTokenFieldDelegate協議控制)表示爲圖形「標記」。該單元格不是每次都重新創建,而只是它表示/繪製的內容。

你的意思是說當你從字段中刪除一個標記字符串時,你想要得到通知嗎?如果是這樣,恐怕這不是它設計的工作方式。 決定什麼字符串(由您告知要使用的標記字段的標記字符集分隔)被標記,以及什麼替換字符串(通常是縮短或清除的版本)顯示爲標記本身。因此,您最多可以來確定模型中的「標記」是否已丟失並自行清理。

簡單地說:在Cocoa Bindings中沒有這樣做的設施。最好維護一個「-tokensNeedCleaning」標誌並將其與-setNeedsDisplay:和-displayIfNeeded方法與NSView一起使用。這樣,當令牌字段被編輯時,您可以調用[self setTokensNeedCleaning:YES]。反過來,該方法可以通過-performSelector:withObject:afterDelay :(帶有零秒延遲)調用「[self cleanTokensIfNeeded]」,以在需要清除標誌爲YES時安排清理丟失的標記。然後它會解除國旗。

這個簡單的機制保持清理例程不會在每次連續編輯時運行,而是標記它並安排它在不久的將來運行,如果它仍然需要的話。這樣,對-cleanTokensIfNeeded的連續預定呼叫將不會盲目地嘗試清理 - 清理呼叫將被合併。

+0

對不起,我感到困惑。假設我想在從字段中刪除標記字符串時收到通知,這是正確的。您的TokensNeedCleaning標誌設置聽起來像是一個合理的解決方案。 但是我遇到了一個新問題。爲了確定哪些標記字符串已被刪除,我需要將保存的值與表單值進行比較。當我通過在我的NSTokenField上調用objectValue來獲取我的表單值時,它的委託被髮送tokenField:representObjectForEditingString:它被設置爲保存一個新的標記。 – tassock 2010-12-06 07:26:35

+0

我發現objectValue不會觸發tokenField :representObjectForEditingString:如果在textDidEndEditing中調用。我爲我的NSTokenField設置了創建和刪除功能。感謝您的指導! – tassock 2010-12-06 09:47:32

0

我只是在另一個話題回答了這個問題,一個似乎是死了,所以我會在這裏回答:

您應該能夠通過創建具有指針令牌包裝類模擬刪除委託回所有者以及被包裝的對象:

@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),確保所有者設置了一些忽略這些回調的位。