他のビューコントローラからアクセスできるようにUIViewインスタンスを何とか保存することはできますか?私はこれがおそらく彼らが悪いと言っている「グローバル」に接していることを知っていますが、私は逃げ出します。私が知っている限り、私はいくつかのUITabBarタブを持っているので、あるタブでインスタンス化されたビューの同じインスタンスを参照する必要があり、別のタブに再度表示する必要があります。そのようなことをするための最良のアプローチは何ですか?異なるUIViewControllerで同じUIViewインスタンスを表示
答えて
確かに。永続オブジェクトのUIView
オブジェクトへの保持された参照を格納するだけで済みます。たとえば、サブクラスUIApplicationDelegate
に保持されているプロパティを追加できます。そのデリゲートにビューをインスタンス化させることができます。すべてのコントローラは、ビューのアプリケーションデリゲートに問い合わせます。常に利用可能なルートビューコントローラがある場合は、そこに保持することができます。
多分あなたのアプリの全体的な構造を考えて、UIView
を格納する "正しい"場所を見つけるのを助けることができます。以下では、頻繁に使用するアプリの構造を紹介します。アプリの構造をアドバイスする必要はありませんが、アプリの最適な構造を考える際に役立つオプションを拡張するための例として示しています。
私はクライアントのためのアプリのような多くのパンフレットを書く。これらのアプリでは、多くのビューを提示する必要があります。それぞれのビューは、パンフレットのページにいくぶん類似しています。これらのビューの一部にはユーザーとのやりとりがあり、画面外では状態を保持する必要があります。また、状態データを他のビューと共有する必要があります。
これらのアプリケーションを管理するために、プレゼンテーションマネージャオブジェクトを作成します。このオブジェクトは、表示されていないときに持続しなければならないビューを含む、アプリケーションの全体的な状態を保持します。プレゼンテーションマネージャを所有する1つのマスタUIViewControllerを使用し、すべての共通ビューコントロール操作を行います。個々のビューの特定のロジックは、各ビューのUIViewサブクラスに入ります。これらの個々のビューは、プレゼンテーションマネージャーによって作成され、永続的なビューを含めて、マネージャーに知らせることができます。
ええ、私のアプリのように聞こえるのは、あなたのものとかなり似ています。スクリーンから離れたときの状態を保持します。 – purefusion
B/CあなたはUITabBarを使用しています。私はあなたのカスタムビューをアプリケーションデリゲートのウィンドウに追加することをお勧めします。次に、それを格納する必要はありません、それを隠すだけです。いずれかのNSNotificationCenterを使用して、通知を送信してビューを表示するか、appDelegateを呼び出してビューを手動で表示することができます。
あなたは、このようなビューコントローラに同じビューのインスタンスを注入するために、依存性注入を使用することができます。
UIView *myView = [UIView new];
UIViewController *controller1 = [UIViewController new];
UIViewController *controller2 = [UIViewController new];
controller1.view = myView;
controller2.view = myView;
[myView release];
@Abhinit:はい、私の答えを更新しました:) –
面白いです。このようなことは考えていませんでしたが、UITabBarControllerが上のコードを使用してインスタンス化するインスタンスとは独立して、各タブのビュー自体をインスタンス化するため、これはUITabBarビューでは機能しません。どのようにその問題を回避するためのアイデアですか? – purefusion
質問のネーミングについてのヒントは、「異なるUIViewControllerで同じUIViewインスタンスを表示する」ように短くしてみてください – Cyprian
私はそれが悪いです!とにかく、私は今あなたの提案にそれを更新しました! :) (以前は「他のビューコントローラによって必要になったときに呼び出すことができるようにUIViewインスタンスを格納する」 – purefusion