it-swarm-ja.com

複数のコントローラー間で「静的」ビューを維持するための正しい設計上の選択?

まず、正しいStack Exchangeコミュニティ内でこれを質問しているかどうかわからないので、この質問が別の場所にある場合は、お知らせください。 StackOverflowには適切ではないようです。

ナビゲーションコントローラーを使用して2つのTableViewController間を移動するiOS用のオーディオブックアプリを開発しています。最初のビューコントローラーは選択可能な本のリストを保持し、2番目のビューコントローラーはそれらの本の章のリストを保持します。ユーザーがチャプター行の再生ボタンをクリックすると、そのチャプターのオーディオの再生が開始されます。

各ビューコントローラーの下部に、標準のオーディオプレーヤーのコンポーネント(再生/一時停止ボタン、トラックスライダー、継続時間、現在のトラック再生のラベル)を保持するカスタムビューを作成しました。

First View Controller - Book SelectionSecond View Controller - Chapter Selection

各ビューコントローラには、オーディオプレーヤービューの独自のインスタンスがあります。共有されたグローバルオーディオプレーヤービューはありません(iOSでこれを行うことさえできないと思いますか?)。

両方のコントローラーの下部にあるオーディオプレーヤーの状態で、ユーザーがアプリ内を移動するときに共有状態を維持したいと思います。たとえば、ユーザーは第1章の行を再生します。第1章のエントリが再生されていることを表示するには、各コントローラーの下部にあるオーディオプレーヤービューが必要です。

どうすればこれを達成できますか?私はiOS開発にかなり慣れていませんが、オーディオプレーヤービューのデリゲートプロトコルを定義し、各ビューコントローラーに実装させる必要があると思いますか?または、オーディオプレーヤーを実装するためのより良い方法はありますか。たぶんカスタムUIToolbarを作成しますか?

2
Gthoma2

私が知る限り、これは質問するのに良い場所です。まず、暗黙の質問を明確にしましょう。

共有オーディオプレーヤービューを持つことはかなり可能です。これを行うには、UINavigationControllerとプレーヤーコントロールを含むビューを保持するカスタムコンテナビューコントローラーを作成します。 UINavigationControllerをサブクラス化して、プレーヤービューをそのビューに直接配置することも可能かもしれません。

上記のアイデアのいずれかを実行すると、この特殊なケースで問題は解決しますが、質問するのは良い質問です。キャリアのある時点で、複数のView Controller間で状態を共有する必要があり、その方法を知っていることが重要だと思います。

あなたの経験によっては、私があなたの質問を「共有状態」の1つとして表現したという事実だけで、あなた自身の答えを生成するように促されたかもしれません。そうでない場合は、以下を読み続ける前に、それについて考えることをお勧めします。


ビューコントローラ間で状態を共有する最も簡単な方法は、それらのビューコントローラ間で状態を含むオブジェクトを文字通り共有することです。より良い方法は、モデルのサブジェクトにオブザーバーパターンを設定し、両方のビューコントローラーをオブザーバーとしてモデルにアタッチすることです。モデルの状態が変わると、View Controllerに通知され、それに応じてビューの状態を更新できます。

2
Daniel T.