2012-01-11 9 views
10

どのようにして、アプリケーションデリゲートのビューからモーダルビューコントローラを表示できますか? UIViewからモーダルビューコントローラを表示しようとすると、混乱しました。presentModalViewControllerのデリゲート

答えて

6

アプリケーションデリゲートはビューを管理しません。 -application:didFinishLaunchingWithOptions:で画面に表示される最初のビューコントローラの-viewDidAppear:メソッドからモーダルビューコントローラを表示する必要があります。

+0

私は実際のUIViewからmodalViewControllerを提示しようとし、そして、最上位のViewController上の任意のアイデアを、これを提示しようとしていますか? – adit

+1

モーダルビューコントローラは、他のビューコントローラでのみ表示できます。彼らが管理するビューには、他のビューコントローラはもちろんのこと、自分のコントローラについての知識もありません。 –

+0

この回答はOPの誤解のいくつかを指摘していますが、本当にその質問には答えません。私の答えを見てください:UIWindow – Steve

11

rootViewControllerを使用してください。任意のビューコントローラサブクラスからモーダルビューコントローラを表示できます。ルートVCがUITabBarControllerである場合は、行うことができます。

[self.tabBarController presentModalViewControllerAnimated:YES] 

た場合、またはそのナビゲーションコントローラを:

[self.navigationController presentModalViewControllerAnimated:YES] 

など

EDIT:MVC

ことでMVCパターンを破っているビュー内からコントローラを表示しようとしています。一般的に、ビューは、ユーザーインターフェイスの状態をコントローラに通知するために、その外観と公開インターフェイスに関係しています。たとえば、ビューにUIButtonがあり、モーダルビューコントローラを表示したい場合は、ビューをハードワイヤ化しないでください。代わりに、コントローラがビューをインスタンス化するとき、コントローラは適切なモーダルビューコントローラを提示できるアクションとしてtouchUpInsideアクションを受け取るターゲットとして自分自身を設定することによってボタンを設定します。

コントローラの作業を行うために、ビュー自体にはこのコンテキスト上の知識はありません。

+2

'rootViewController'が既にモーダルビューコントローラを提示している場合、動作しません。 – Steve

+0

これは単なる例でした。私はOPのアプリの完全な論理を知らない。また、適切な技法が理解できれば、必要に応じて何をやっているのかを完全に知ることができます。 – XJones

+0

'UIWindow'ベースのアプローチは、常にボード上で動作し、カスタムロジックはありません。ちょうど' UIAlertView'のように常に動作します。 OPがその動作を望んでいると仮定している – Steve

10

UIWindowを新規に作成し、windowLevelプロパティを設定し、UIViewControllerをそのウィンドウに表示するのが最も良い方法です。

これはどのようにUIAlertViewの仕事です。

インタフェース

@interface MyAppDelegate : NSObject <UIApplicationDelegate> 

@property (nonatomic, strong) UIWindow * alertWindow; 

... 

- (void)presentCustomAlert; 

@end 

実装:

@implementation MyAppDelegate 

@synthesize alertWindow = _alertWindow; 

... 

- (void)presentCustomAlert 
{ 
    if (self.alertWindow == nil) 
    { 
     CGRect screenBounds = [[UIScreen mainScreen] bounds]; 
     UIWindow * alertWindow = [[UIWindow alloc] initWithFrame:screenBounds]; 
     alertWindow.windowLevel = UIWindowLevelAlert; 
    } 

    SomeViewController * myAlert = [[SomeViewController alloc] init]; 
    alertWindow.rootViewController = myAlert; 

    [alertWindow makeKeyAndVisible]; 
} 

@end 
+0

魅力的な作品です。 –

+0

すばらしく便利な回答 – Fattie

関連する問題