2009-07-30 11 views
5

スタートアップ時にモーダルのUITableViewを使用して、パスワードなどの設定をしていないユーザーに質問したいと思います。しかし、uitableviewを呼び出すコマンドは、viewDidLoadの内部では機能していないようです。起動時にpresentModalViewControllerを使用できますか?

スタートアップコード:

- (void)viewDidLoad { 
    rootViewController = [[SettingsController alloc] 
    initWithStyle:UITableViewStyleGrouped]; 
    navigationController = [[UINavigationController alloc]  
    initWithRootViewController:rootViewController]; 

    // place where code doesn't work 
    //[self presentModalViewController:navigationController animated:YES]; 
} 

ボタンにより、後で呼び出されたときしかし、同じコードが正常に動作します:

- (IBAction)settingsPressed:(id)sender{ 
    [self presentModalViewController:navigationController animated:YES]; 
} 

関連質問:どのように私は(上位に)感じるんUITableViewはコマンドを使用して終了しましたか?

[self.parentViewController dismissModalViewControllerAnimated:YES]; 

答えて

7

あなたは、コード内の別の場所presentModalViewController:animated:電話をかけることができます - それは、ビューコントローラのviewWillAppear方法で動作するはずです、またはアプリのデリゲートでapplicationDidFinishLaunching方法で(私は私の上発射モーダルコントローラを配置場所です)。

ビューコントローラが消滅したときを知ることで、親ビューコントローラでメソッドを定義し、子コントローラのdismissModalViewControllerAnimatedの実装をオーバーライドしてメソッドを呼び出すことができます。このようなもの:

// Parent view controller, of class ParentController 
- (void)modalViewControllerWasDismissed { 
    NSLog(@"dismissed!"); 
} 

// Modal (child) view controller 
- (void)dismissModalViewControllerAnimated:(BOOL)animated { 
    ParentController *parent = (ParentController *)(self.parentViewController); 
    [parent modalViewControllerWasDismissed]; 

    [super dismissModalViewControllerAnimated:animated]; 
}
+0

viewWillAppearを試したところ、viewdidloadと同じ悪影響を受けました。私は[self presentModalViewController:navigationController animated:YES]を使用します。 applicationDidFinishLaunchingでは、私は "SIGABRT"を取得します。私はおそらくそれを間違って呼び出しているでしょう – BankStrong

+0

'applicationDidFinishLaunching'からそれを呼び出すことはできません - それはビューコントローラではないデリゲートに属するメソッドです。ルートビューコントローラオブジェクトが必要です。しばしばXcodeによって自動的に作成されます。あなたのアプリのタイプに応じて、 'viewController'、' rootController'、または 'tabBarController'と呼ばれる合成されたプロパティを探します。 – Tim

+1

それは不明確かもしれません(ごめんなさい!);私は 'applicationDidFinishLaunching'で' self present ...] 'を実行できませんでした。代わりに' [self.viewController present ...] 'を実行する必要があります。これはビューコントローラの名前によって異なりますオブジェクト。 – Tim

0

あなたはそのようにそれをやろうとしているなら、あなたは、のUITableViewはparentViewController却下したときに伝えることができるように、独自のプロトコルを宣言する必要があるとしているあなたは

のようなメソッドを持っているプロトコルを宣言するように、
-(void)MyTableViewDidDismiss 

このプロトコルを実装することができます。そして、あなたはMyTableViewDidDismissを親ビューコントローラであるMyTableViewDidDismissを呼び出すことができます。

6

私は全く同じ問題を抱えていました。あなただけの方法であなたのモーダル定義を移動する必要が ...私はトピックが古いです知っているが、多分私の解決策は、他の誰かを助けることができる:

// ModalViewController initialization 
- (void) presentStartUpModal 
{ 
    ModalStartupViewController *startUpModal = [[ModalStartupViewController alloc] initWithNibName:@"StartUpModalView" bundle:nil]; 
    startUpModal.delegate = self; 

    [self presentModalViewController:startUpModal animated:YES]; 
    [startUpModal release]; 
} 

viewDidLoadで次に、performSelector:withObject:afterDelay:であなたのモーダル定義メソッドを呼び出します遅れ値として0である。このように:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    //[self presentStartUpModal]; // <== This line don't seems to work but the next one is fine. 
    [self performSelector:@selector(presentStartUpModal) withObject:nil afterDelay:0.0]; 
} 

「標準的な」方法が機能しない理由はまだ分かりません。

+0

これを投稿していただきありがとうございます。私はこれを数日間働かせようとしてきましたが、これは私の同様の問題を解決しています。あなたのように、私は最初のものがなぜ機能しないのか分かりませんが、2番目のものはなぜ問題は解決しますか? – gnuchu

+0

ありがとう!これはうまくいった。 –

関連する問題