2011-12-23 6 views
3

私のアプリでは、特定のモデルオブジェクト(NSManagedObjectのサブクラス)にタグを付けることができます。 TagクラスはNSManagedObjectのサブクラスでもあります。私はNSTokenFieldを使ってタグを表示することにしました。各トークンは、表現されたオブジェクトとしてTagのインスタンスを保持しています。すべて正常に動作しますが、関連するタグが廃止され、削除する必要があるかどうかをチェックしたいので、ユーザーがトークンを削除する状況に陥っています。NSTokenFieldとトークンを削除する

私はNSTokenFieldDelegateまたはNSTokenFieldCellDelegateという方法で、トークンの削除アクションを傍受して確認することができます。

グーグルで私はthis postのトピックに対処しました。私は提案されたメソッドcontrolTextDidChange:を私のコントローラ(トークンフィールドの代理人)に実装しました。引数として渡されたコントロールを調べると、ドキュメントは見つかりません(おそらくプライベートクラス)NSTokenTextViewのインスタンスであることが明らかになりました。

誰かがこの問題にぶつかり、表現されたオブジェクトの基になるモデルを維持しながら、トークンを正常に削除するソリューションを見つけましたか?

EDIT

私はそれだけで私たちの残りの部分のように動作するように設計されていない何らかの理由で期待することを示唆しているように思われ、同様thisを見つけました。

答えて

3

トークンが削除されたことを所有者:

@implementation TokenWrapper 

... 

-(void)dealloc { 
    [owner tokenWasDeleted:self.token]; 
    self.token = nil; 
    [super dealloc]; 
} 

@end 

は、その後、あなたの representedObjectForEditingStringコールバックで、あなたの所有者とあなたの本当のトークンで自動解放ラッパーポインティングを返します。他のNSTokenFieldデリゲートコールバックを変更して、ラッパーオブジェクトを調べる必要があります。 (setObjectValueを呼び出すなどして)NSTokenFieldの内容を手動で変更しているときに、所有者がこれらのコールバックを無視するようにビットを設定するようにしてください。

+0

確かに非常に良い! – Roger

3

NSTokenFieldを使用してタグを編集するアプローチをあきらめました(6時間以上ぐらい)。私は最終的に、この機能がさまざまな場所で必要とされているので、私のアプリケーションに波及するいくつかの壊れやすいハックで終わった。

NSTokenFieldは、私の意見に反していくつかの強みがある場合を除き、パーティーに半分焼いた実装をもたらす醜いモンスターです。それは本当に私の魅力のプレゼンテーションの側面として残念です...

編集:私はいくつかのさらなる実験の後、合理的に受け入れられる妥協を決めました。私は読み取り専用モードでNSTokenFieldを使用します。それは私のコアデータストアから関連するタグを取り出し、それらをトークンとして表示します。私は、ユーザーがタグを編集、削除、またはレビューできるメニューを各トークンに追加しました。トークンフィールドの隣にある標準のプッシュボタンを使用すると、新しいタグを追加できます。編集とレビューはNSPopoversを使用して実装されています。この例を参照してください:

enter image description here

は、まだいくつかのマイナーな問題があります。

  • トークンがトークン・フィールドの上にマウスを移動するとき、任意のタイミングで消える傾向にあります。これはバグのようです。
  • トークンフィールドはそのバインディングのためだけにNSArrayを受け入れるので、関連するタグを取り、それらをNSSetからNSArrayに変換するtagsAsArrayという名前の「仮想プロパティ」を導入しました。これはKVOに影響すると思います。タグの編集は、Enterキーを押すかトークンフィールドの外側をクリックした後にのみ表示されます。

    @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を通知してきた:あなたが戻って所有者だけでなく、ラップされたオブジェクトへのポインタを持っているトークンラッパークラスを作成することにより、削除デリゲートをシミュレートすることができるはず

関連する問題