2

メインコンテンツを表示する「メイン」ビューコントローラーと、スライドアウトビュー内のコンテナーに保持される「設定」テーブルビューコントローラーの2つのビューコントローラーがあります。コンセプトは次のとおりです。

  1. ユーザーが設定パネルの項目をタップします。
  2. 設定 TVC は、すべてのボタン設定を含む「ボタンの状態」ディクショナリ オブジェクトを作成します。
  3. ボタン状態ディクショナリは、ボタン状態を、メイン モデル オブジェクトが理解できる設定のディクショナリに変換するクラスに渡されます。
  4. __ _ __ __ ??? _

この時点で、メイン ビュー コントローラー (メイン モデル オブジェクトのインスタンスを保持する) に、設定が更新されたこと、およびモデル オブジェクトの設定を更新する必要があることを通知する必要があります。どうすればこれを行うことができますか?メイン ビュー コントローラーにクラス メソッドを設定し、ヘッダー ファイルを設定変換クラスに含める必要がありますか?

4

4 に答える 4

4

他の回答とは対照的に、ここではシングルトンを使用する必要はありません。必要なのは、メイン ビュー コントローラーと設定ビュー コントローラーの間で共有されるオブジェクト、またはそれらの間で情報を渡す何らかの方法だけです。新しいシングルトン クラスを必要としないいくつかのオプションを次に示します。

  • 共有モデル:設定を追跡するためにモデル クラスを使用している場合、メイン ビュー コントローラーと設定ビュー コントローラーの両方にモデルについて伝えるだけで、両方がモデルにアクセスできます。たとえば、アプリの起動時に両方のビュー コントローラーを作成する場合、モデルを同時に作成して、モデルを両方のコントローラーに渡すことができます。

    MyModel *model = [[MyModel alloc] initWithFilePath:somePath];
    MainViewController *mainVC = [[MainViewController alloc] initWithNibName:nil bundle:nil];
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
    mainVC.model = モデル;
    settingsVC.model = モデル;
  • 共有オブジェクト:モデル クラス全体を保持する必要がなく、2 つのコントローラー間でいくつかの変更をやり取りするだけでよい場合は、ディクショナリなどの単純なデータ コンテナーのみを共有させます。たとえば、メイン ビュー コントローラーが設定ビュー コントローラーを作成し、それをナビゲーション スタックにプッシュするとします。「これは変更可能な辞書です。これを使用して、必要な設定を取得し、変更を記録します。」メイン ビュー コントローラーのコードは次のようになります。

    self.settings = [NSMutableDictionary 辞書];
    // ...すべての設定を辞書に追加するコード...
    SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];
    settingsVC.settings = self.settings;
    [self.navigationController pushViewController:settingsVC];
  • 委任:前の状況を考慮してください。ただし、変更可能な辞書またはモデル オブジェクトを設定ビュー コントローラーに渡す代わりに、メイン ビュー コントローラー自体を共有オブジェクトとして渡します。設定がメイン ビュー コントローラーのプロパティである場合、設定ビュー コントローラーはそれらのプロパティにアクセスして (アクセサーを使用してください)、設定を取得および設定できます。または、向きを変えて、必要な設定の値を要求できるように、メイン ビュー コントローラーが設定ビュー コントローラーへの参照を維持するようにします。いずれにしても、一方のビュー コントローラーがもう一方のヘルパーとして機能します。これがデリゲート パターンです。

  • NSUserDefaults:共有ユーザー デフォルト オブジェクトは既にシングルトンであるため、別のオブジェクトは必要ありません。両方のビュー コントローラーは、共有ユーザー デフォルト オブジェクトにアクセスして、必要な設定を取得/設定するだけです。

どちらを選択する場合でも、-viewWillAppear各コントローラーの設定を確認し、必要に応じて UI を更新する必要があります。

あなたの質問は、ほとんどの場合、2 つのビュー コントローラーを相互に通信させる方法に関するものです。それには多くの方法があり、それらのいずれにもシングルトンは必要ありません。

于 2013-07-01T05:30:18.560 に答える
1

設定用のシングルトン クラスを作成できます。ここにリンクがありますそれを行う方法シングルトンのケアとフィード

あなたのシングルトンが SharedSettings と呼ばれているとしましょう。ビューの設定を変更するたびに、SharedSettings シングルトンで設定を変更し、この変更を適用するようにビューに指示する必要があります。「ビューを伝える」ために、objective-c にはデリゲートと NSNotificationCenter の 2 つの最も一般的な方法があります。

ここにデリゲートのチュートリアルがありますデリゲートの

そして、ここに通知のリンクがありますNSNotificationCenter チュートリアル

デリゲートと通知の違いは、デリゲートは 1 つのクラスに通知するために使用されることです。たとえば、likecellForRowAtIndexPathと通知は 1 つの通知で多くのオブザーバーに通知するために使用されます。色を変更するには、5 つのビューすべてに通知する必要があります。また、通知はデリゲートよりも少し遅いと見なされます。

シングルトン、デリゲート、または通知について質問がある場合は、お気軽にお問い合わせください。

于 2013-06-22T08:45:53.440 に答える
1

私は似たようなことをするアプリを持っています。私の設定ビューでは、設定が変更されるたびに、設定ビューで設定を追跡するシングルトン オブジェクトを呼び出すように設定ビューを設定します。メイン ビューに戻ると、viewWillAppearメソッドでシングルトンをチェックして、どの設定が設定されているかを確認し、それに応じて UI を更新します。

于 2013-06-22T05:29:51.460 に答える
0

モデルとの通信を「メイン」ビュー コントローラーだけに制限する必要はありません。設定テーブル ビュー コントローラーもモデルに直接アクセスできます。通常、すべてのモデル アクセスを 1 つの場所に集めてもあまりメリットが得られず、その代わりに、そのメイン コントローラーとの間でモデル値をやり取りするための無意味な並列システムを発明する必要があります。

代わりにモデル オブジェクトをシングルトンにし、任意のコントローラーからのアクセスを許可します。

ただし、アーキテクチャを維持する必要がある場合は、設定ビューが閉じていることをメイン ビュー コントローラーに通知する方法が必要です。おそらく、メイン ビュー コントローラーが監視する通知を投稿すると、更新された設定ディクショナリが通知オブジェクトになる可能性があります。

于 2013-06-22T05:22:20.593 に答える