0

Aaron HillegassのCocoa Programming for Mac OS Xでは、RaisemanアプリケーションはInterface Builder(IB)のボタンを送信アクション-remove:NSArrayControllerに接続します。マイドキュメントクラスで彼は2つのKVCメソッドを実装しています:このボタンを押すとKVC Hillegassの理解と再現コントローラ内のオブジェクトの挿入/削除

- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index; 
- (void)removeObjectFromEmployeesAtIndex:(int)index; 

-removeObjectFromEmployeesAtIndex:メソッドが呼び出されると、現在選択された人物(モデル)オブジェクトが配列から除去されます。

  1. remove:メソッドでは、どのようにして-removeObjectFromEmployeesAtIndex:メソッドが呼び出されるのですか?
  2. NSTreeControllerでこのエフェクトを再生するにはどうすればよいですか?
+0

あなたはツリーコントローラで何を試しましたか?それはどのように失敗しましたか?それは有益な情報になります。 – Dov

+0

ノードとノードの2つのタイプがあります:FolderオブジェクトとPersonオブジェクトです。 IBでは、ツリーコントローラのオブジェクトコントローラクラス名をFolderまたはPersonに設定することで、どちらか一方を追加できます。しかし、これは、ツリーの深さに応じて、または追加と削除ボタンの別のペアを使用して、フォルダまたはPersonのいずれかを追加することはできません。 –

答えて

0

シンプルな組み込みオプションが必要な場合は、IBで指定したクラスのインスタンスのみを作成します。別のインスタンスを作成するには、自分でコードを作成する必要があります。新しいクラスを階層の適切な場所に挿入するには、Tree Controllerから必要な情報をすべて取得する必要があります。いくつかの勤勉な検索は、必要なコードを提供する必要があります。

NSArrayControllerメカニズムがどのように機能するかを理解するのを助けるために、私がObjective-Cとランタイムについて知っていることを説明します。 Objective-Cは非常に動的な言語であり、セレクタ(メソッド)を動的に呼び出すことができます。 NSArrayControllerがあなたのクラス(例えば、「従業員」)の名前を知っているので、その内部実装は、おそらく(可能性、容易または)以下のようになります。

NSString *removeSelectorName = [NSString stringWithFormat:@"removeObjectFrom%@sAtIndex:", 
           self.objectClassName]; 
SEL removeSelector = NSSelectorFromString(removeSelectorName); 

[dataRepresentation performSelector:removeSelector 
         withObject:[NSNumber numberWithInt:self.selectionIndex]; 

この例では、のように、KVOの他の場所であります。 +keyPathsForValuesAffecting<Key>メソッド(documentation here)は、どのキーによって別のキーが更新されるかを示します。あなたの鍵はfullNameの名前と姓または名の変更は、あなたのクラスでこれを実装したときに、それが更新された場合:

+ (NSSet *)keyPathsForValuesAffectingFullName { 
    return [NSSet setWithObjects: 
      @"firstName", 
      @"lastName", 
      nil]; 
} 

さらに検索(およびthis question)どのようにその意味を説明し、このdocumentation pageを、上げメソッドが呼び出されます。

+0

いずれの場合でも、IBで使用されるremove:メソッドは、-removeObjectFromEmployeesAtIndex:メソッドをKVCで呼び出す方法をどのようにしますか? –

+0

説明付きで更新されました。 – Dov

+0

以前私はその質問とドキュメンテーションのページを見ました。それは言う: "mutableArrayValueForKeyのためのデフォルトの検索パターン:..."問題は本当にです:どのように誰かが知っているだろうinsert:mutableArrayValueForKey :(実際には)を呼び出す - ドキュメントはどこですか?現在、Hillegassらはそれを使用していますが、彼らはそれをどのように使用するかを知っていません。ありがとうございました。 –

関連する問題