1

今日まで非常にシンプルなアプリを持っています。3つのタブを備えたタブバービューコントローラがありました。真ん中のタブはカメラで、他の2つはテーブルビューでした。タブバービューコントローラーは、アプリ内のすべてのデータの中心的なハブでした。したがって、そこから、テーブルのデータ配列を次のように設定します。

(PLEListViewController*)[self.viewControllers objectAtIndex:0] setList:newList];

明らかに、PLEListViewController私のUITableViewサブクラスです。

だから今、私はテーブルビューをでラップしたいと思いますUINavigationController。これはかなり簡単です。しかし今、そのコード行は次のようになります。

[(PLEListViewController*)((UINavigationController*)[self.viewControllers objectAtIndex:0]).topViewController setList:newList];

これを行うコードには15行ありますが、これは快適ではありません。

だから私の質問:私が欠けているこれを行うためのよりエレガントな方法は何ですか?

4

3 に答える 3

4

アーキテクチャを操作する必要があります。クラスが匿名で通信できるように、適切なデータソースと委任プロトコルを作成します。あなたが現在持っているものは非常に柔軟性がなく、アプリが成長/変化するにつれて悪化します。

于 2013-01-25T21:24:26.390 に答える
4

あなたがこれを尋ねて、今問題を見ているのは良いことです。あなたの問題はあなたの質問にあります。「ObjectiveCの複数の異なるViewController間で通信する正しい方法」に対する答えは、「しない」です。具体的には、あなたの間違いはここにあります:

タブバービューコントローラーは、アプリ内のすべてのデータの中心的なハブでした。

ビューコントローラは、アプリ内のデータを保持してはなりません。データはモデルクラスに存在する必要があります。すべてのViewControllerはモデルクラスと通信する必要があります。彼らはめったにお互いに話すべきではありません。それがMVCの心臓部です。

したがって、「リスト」(つまり、関係ありません)を、すべてのViewControllerが認識しているモデルオブジェクトに移動します。そのモデルオブジェクトはシングルトンにすることも、多くの場合、作成時にViewControllerに渡すこともできます。物事が変わるとき、あなたはモデルを変えます。そしてviewWillAppear:、モデルの現在の状態に一致するようにViewControllerを更新します。

ビューコントローラが現在画面に表示されていないときに存在すると思い込まないでください。デザインで非アクティブなViewControllerが存在する必要がある場合は、デザインを修正する必要があります。

于 2013-01-26T23:02:33.433 に答える
1

コード内のオブジェクト間のリンクの明示的なトラバーサルをコーディングするのではなく、物事をより緩く結合させたいと考えています。

アプリケーションのさまざまな場所に表示される1つのデータモデルがあると仮定すると、役立つ2つのアプローチがあると思います...

1つは、ビューコントローラ階層を使用することです。たとえば、を使用[ self enclosingTabBarController ]して、最も近い親タブバーコントローラを検索し、そのデータモデルプロパティを取得します。アプリケーション-enclosingTabBarControllerに適したものに置き換えてください。

もう1つのアプローチは、「シングルトンとしてのデータモデル」アプローチです。このためにあなたはどちらかをすることができます

  • データをアプリケーションデリゲートに移動し、経由でアクセスします((MyApplicationDelegateClass*)[ UIApplication sharedApplication ].delegate).dataModel

また

  • アプリのシングルトンデータモデルオブジェクトを用意し、[ MyDataModelClass sharedModel ]

いずれにせよ、より緩い結合に移行しているため、アプリ内のオブジェクト間のリンクを明示的にトラバースする必要はありません。少ないほうがいいですね!

于 2013-01-26T23:05:12.853 に答える