2010-12-05 2 views
0

管理対象オブジェクトを表すNSTokenFieldCellを持つNSTokenFieldがあります。私は次のように入力して、新しい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]"を呼び出して、needsCleaningフラグがYESの場合に欠落トークンのクリーンアップをスケジュールできます。フラグがセットされなくなります。

この単純なメカニズムは、連続する編集ごとにクリーンアップルーチンが実行されるのを防ぎますが、それにフラグを立てて、それが必要であれば直ちに実行するようにスケジュールします。こうすることで、-cleanTokensIfNeededを連続して定期的に呼び出すことで、盲目的にクリーンアップしようとすることはありません。クリーンアップコールは合体します。

+0

混乱して申し訳ありません。トークン化された文字列がフィールドから削除されたときに通知を受けたいと思うのは間違いありません。 TokensNeedCleaningフラグの設定は、合理的な解決策のように聞こえます。 しかし私は新しい問題に遭遇しました。トークン化された文字列が削除されたかどうかを判断するために、保存された値とフォームの値を比較する必要があります。 NSTokenFieldでobjectValueを呼び出すことによってフォームの値を取得すると、その代理人にはtokenField:sentObjectForEditingStringが送信されます。これは新しいトークンを保存するように設定されています。 – tassock

+0

objectValueがtokenFieldをトリガーしないことがわかりました:representObjectForEditingString:textDidEndEditing内で呼び出された場合。私はすべてNSTokenFieldの機能を作成して削除するように設定されています。ガイダンスをありがとう! – tassock

0

私は別のトピックでは、この質問に答え、1つは死んでいるようだので、私はここにお答えします:

あなたはポインタを持っているトークンラッパークラスを作成することにより、削除デリゲートをシミュレートすることができるはずですバック所有者だけでなく、ラップされたオブジェクト:

@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デリゲートコールバックを変更して、ラッパーオブジェクトを調べる必要があります。 (setObjectValueを呼び出すなどして)NSTokenFieldの内容を手動で変更しているときに、所有者がこれらのコールバックを無視するようにビットを設定するようにしてください。

+0

1)しかし、representObjectForEditingStringから特定のトークンを取得する方法は? 2)トークンを取得しても、そのときだけ編集している場合 - (void)tokenWasDeleted:(id)token;方法。それ以外の場合は、私が選択し、削除を指示します。それは電話しません。それから私はどのようにその特定のトークンを取得します。 –

関連する問題