2012-05-09 7 views
1

iOS SDKに付属しているアクションシートなど、画面全体を満たさないカスタムモーダルダイアログが必要なことがよくあります。このダイアログでは、インターフェイスのローテーションなどの複雑なシナリオや条件を処理する必要があります。また、多くの場合、ユーザーの選択肢を処理するためのコードが多く含まれています。したがって、通常のビュー+コントローラの組み合わせとしてダイアログを構築し、UIのファーストクラスの市民のように機能させることが非常に望ましいようです。通常のビューコントローラとしてカスタムモーダルダイアログを設計するにはどうすればいいですか?

システムモダルコントローラAPI(presentModalViewController:animated:)は、この点でかなり制限されています。たとえば、コントローラをモーダル1の下に隠しておき、あらかじめ定義されたアニメーションを制御器で使用する必要があります。

コントローラー格納APIは、画面上で複数のビューを一度に許可し、それぞれ異なるコントローラーによって管理されるため、非常に有望です。 (これは、通常のView Controllerの上にモーダルダイアログを置いた場合とまったく同じです。)しかし、標準のコンテナコントローラ(UINavigationControllerなど)との相互作用は、岩です。as I have found outです。

非フルスクリーンのモーダルダイアログを通常のビューコントローラとして使用し、UIの残りの部分とうまくやり取りできるようにするテクニックがありますか?

答えて

0

あなたが本当にそれをビューコントローラにしたいなら、iOS 5で導入された封じ込めAPIを使う必要があります。私はあなたに完全に同意します - それは一種の岩ですので、私は通常別のアプローチを選択します。

NSObjectをサブクラス化し、それをinterfacebuilderのオブジェクトとして追加するコントローラを作成します。次に、コンテナとコンテンツビューの両方を持つようにコントローラをセットアップしました。私はパラメータとしてcontainerViewを取る初期化メソッドを作成し、通常はそのメソッドのviewWillAppearで行ったことをやります。初期化メソッドは、コンテナビューをモーダルコントローラに渡す責任があるビューコントローラから呼び出されます。

初期化されると、モーダルコントローラは、コンテナビューとコンテンツビューの責任を持ちます。モーダルコントローラーが一度消されると、スーパービューから削除されます。

iPadアプリのメインビューコントローラーから呼び出す方法は次のとおりです。関連性のないものからの抽象的な:

- (IBAction)showAddProduct:(UIButton *)sender { 
    UIView *containterForAddProduct = self.darken; 
    containterForAddProduct.alpha = 0; 
    [self.view addSubview:containterForAddProduct]; 
    [self.addEditProductController beginAddingProductInContainerView:containterForAddProduct andManagedObjectContext:self.gridController.managedObjectContext]; 
} 
+0

欠点は、そのようなコントローラはコントローラ階層の一部ではないため、ローテーションおよびアピアランスコールを受信しないことです。これは私が避けようとしていることですが、 'presentModalViewController:animated:'を使って提示されるように、モーダルダイアログをUIの通常の部分にするのが大好きです。 – zoul

+0

親ビューコントローラと一緒に回転させたい場合は、自動的にそれを行うことに問題はありません。しかし、親ビューコントローラとは異なる方法で動作させたい場合は、自分自身でwillRotateのメソッドを実装し、親のviewcontrollersデリゲートメソッドから呼び出す必要があります。 –

+0

それは、私はビューのコンテンツを完全に交換できるようにしたいのですが、一般的には、通常のビューコントローラーでできることは何でもできます。親ビューコントローラからのすべての情報とコールバックを手動で中継するので、私はいくつかの "システム"ソリューションを考え出しています。包含APIは、 'UINavigationController'の問題でなければ、非常に* closeです。 – zoul

関連する問題