0

Aaron Hillegass のCocoa Programming for Mac OS Xでは、Raiseman アプリケーションが Interface Builder (IB) のボタンをNSArrayControllerwith send actionに接続します-remove:。MyDocument クラスで、彼は 2 つの KVC メソッドを実装します。

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

このボタンを押すと、-removeObjectFromEmployeesAtIndex:メソッドが呼び出され、現在選択されている Person (Model) オブジェクトが配列から削除されます。

  1. remove:IB で使用されるメソッドはどのようにして-removeObjectFromEmployeesAtIndex:メソッドを呼び出しますか?
  2. でこの効果を再現するにはどうすればよいNSTreeControllerですか?
4

1 に答える 1

0

単純な組み込みオプションが必要な場合は、IB で指定したクラスのインスタンスのみを作成します。別のインスタンスを作成するには、自分でコーディングする必要があります。新しいクラスを階層内の適切な場所に挿入するには、ツリー コントローラから必要なすべての情報が必要です。いくつかの入念な検索により、必要なコードが得られるはずです。

メカニズムがどのように機能するかを理解できるようにNSArrayController、Objective-C とランタイムに関する私の知識からできる限りのことを説明します。Objective-C は非常に動的な言語であり、セレクター (メソッド) を動的に呼び出すことができます。はクラスの名前 (例: "Employee") を知っているのでNSArrayController、その内部実装はおそらく次のようになります (または簡単にできます)。

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

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

この例は、KVO の他の場所にあり、+keyPathsForValuesAffecting<Key>メソッド (ドキュメントはこちら) のように、どのキーが別のキーを更新するかを説明しています。キーに名前が付けられfullNameていて、姓または名が変わるたびにキーが更新される場合、これをクラスに実装します。

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

さらに検索 (およびこの質問) すると、このドキュメント ページが見つかりました。これは、そのメソッドがどのように呼び出されるかのセマンティクスを説明しています。

于 2011-12-14T13:04:12.737 に答える