2

セグエを使用して ViewController から別の ViewController にデータを渡す方法について、いくつかのチュートリアルを読みました。

一般的なアプローチはあまり良くありません.IMHO:ソースViewControllerは宛先ViewControllerへの参照を取得できるため、宛先ViewControllerでいくつかのプロパティを設定できます。しかし、ソース ViewController が宛先 ViewController の一部を認識しているという事実は、必然的にオブジェクト間のデカップリングを減少させます。

このようなより一般的なアプローチが可能かどうか疑問に思っています:

  • ソース ViewController はセグエを実行し、送信先の ViewController の特定のプロパティを知らなくても、送信したいデータを含む NSDictionary をパックします (NSNotifications のように)。
  • 宛先ViewControllerはNSDictionaryにアクセスでき、独自のデータ構造を埋めることができます。

これが可能かどうか誰にもわかりますか?

4

2 に答える 2

1

prepareForSegue:sender:ストーリーボードを使用するときに、あるViewControllerから別のViewControllerにデータを渡すための推奨される方法です。昨年のWWDCのストーリーボードセッションをご覧ください。Appleがこの方法も推奨していることがわかります。

sobriが言ったことを繰り返すと、View Controllerコードには通常、アプリの「ビジネスロジック」が含まれているため、通常、アプリ内で最も再利用しにくいコードです。この記事の執筆時点では、アプリストアに7つのアプリがあり、ViewControllerコードの重要な部分を一度も再利用したことはありません。

ほんの少しの抽象化を提供したい場合(たとえば、宛先View Controllerへの強い依存を回避したい場合)、次のようにすることができます。私のアプリの1つにほぼこの正確なコードがあります。

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    if( [[segue identifier] isEqualToString:@"showLog"] ) {
        UIViewController* logView = segue.destinationViewController;
        if( [logView respondsToSelector:@selector(setManagedObjectContext:)] ) {
            [logView setValue:self.managedObjectContext forKey:@"managedObjectContext"];
        }
    }
}

NSKeyValueCoding'sを使用して、辞書で同様のことを行うことができますsetValuesForKeysWithDictionary:。私はおそらくmultiple setValue:forKey:自分自身で電話を使うでしょう

于 2012-08-19T03:07:18.687 に答える
0

これは意見ですが、View Controller はオブジェクト指向の純粋性には適さないと考えています。

ビュー コントローラーは、単一のアプリのアーキテクチャに非常に固有であり、通常は一般的な使用を目的としていません。少なくとも私の考えでは、一般化されたクラスと、1 つのアプリのみを 1 つの方法で消費するように明示的に設計されたクラスとの間には明確な違いがあります。

強く結合されたビュー コントローラーは、コードの複雑さを軽減します。クラスの分離は、コードの複雑さを軽減するためのガイドラインです。デカップリングによって複雑さが増した場合、それはガイドラインの意図に反していました。

したがって、より直接的に答えるには、ビューコントローラー間でデータを渡す最良の方法は、送信側のビューコントローラーが受信側のビューコントローラーのインターフェイスを認識し、変数を直接渡すことだと思います。そうしないと、時期尚早の最適化と見なされる可能性があります。

于 2012-08-09T13:27:16.343 に答える