私は別のトピックでは、この質問に答え、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の内容を手動で変更しているときに、所有者がこれらのコールバックを無視するようにビットを設定するようにしてください。
混乱して申し訳ありません。トークン化された文字列がフィールドから削除されたときに通知を受けたいと思うのは間違いありません。 TokensNeedCleaningフラグの設定は、合理的な解決策のように聞こえます。 しかし私は新しい問題に遭遇しました。トークン化された文字列が削除されたかどうかを判断するために、保存された値とフォームの値を比較する必要があります。 NSTokenFieldでobjectValueを呼び出すことによってフォームの値を取得すると、その代理人にはtokenField:sentObjectForEditingStringが送信されます。これは新しいトークンを保存するように設定されています。 – tassock
objectValueがtokenFieldをトリガーしないことがわかりました:representObjectForEditingString:textDidEndEditing内で呼び出された場合。私はすべてNSTokenFieldの機能を作成して削除するように設定されています。ガイダンスをありがとう! – tassock