0

ストーリーボードを使用し、KVC を使用してクラス間の結合を削減しようとしています。連絡先アプリと同様に、データを編集できる新しいビュー コントローラーをプッシュする編集可能なフィールドがあります。detailViewController の 1 つを表示する前に、次のようなことを行います。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([[segue identifier] isEqualToString:@"ShowDetailMap"]) {
        UIViewController *destination = ((UINavigationController *)segue.destinationViewController).topViewController;

        if ([destination respondsToSelector:@selector(setMapTypeAsNum:)]) {
            [destination setValue:[NSNumber numberWithInteger:self.mapView.mapType] forKey:@"mapTypeAsNum"];

            [destination addObserver:self forKeyPath:@"mapTypeAsNum" options:NSKeyValueObservingOptionNew context:NULL];
        }

Observer を削除して、クラス間の疎結合を維持するにはどうすればよいですか? viewController クラスを UINavigationControllerDelegate プロトコルに準拠させることはできますが、次のようなことを行うのは良くないようです。

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {

    if ([viewController respondsToSelector:@selector(setNewmap:)]) {
        if ([[navigationController topViewController] isKindOfClass:[AddMapViewController class]]) {
           // remove observer
        }
    }
}

DetailViewController が特定のタイプであるかどうかを確認し、そのView Controllerのオブザーバーを削除するよりも、Observerを削除するためのより良い方法があるはずです。何をお勧めしますか?ありがとう。

4

1 に答える 1

0

それを行う1つの方法は、すべての基本クラスに2つのメソッドを持たせることです

  • 1 つは、ターゲットと観測キーをパラメーターとして受け取るオブザーバーを登録するためのものです。基本クラスの関数は何もしません。この関数は継承され、オブザーバーを登録するために子クラスで再定義されます。
  • 他の関数は、そのキーまたはすべての観測キーに対する観測を削除します。この関数は基本クラスでは何もしませんが、派生クラスでは、指定した観測キーが準拠している場合は削除されます。

このメソッドを使用すると、クラスが指定された観察に準拠しているかどうかを呼び出し元が心配する必要がないため、ビューの分離が最大化されます

于 2012-06-01T06:43:10.690 に答える