最初にユーザーにログイン ウィンドウを表示する iOS 5 アプリケーションに取り組んでいます。ログインに成功すると、実際のアプリの大部分を含む UINavigationController を提示する Modal Segue が実行されます。この時点から多くのことが発生する可能性がありますが、私が興味を持っているのは、ユーザーがログアウトすることを決定したときです。
最初のビューであるログイン ウィンドウに戻りたいのですが、Navigation Controller をポップして最初のビューに戻ることができないようです。
視覚化として:
(NavigationController)
[UserLoginViewController] --modal segue-> [UserMenuTableViewController] --push segue--> [otherviews, etc]
^ |
| modal segue
| |
| v
^ [UserDashBoardViewController]
| |
| (logout pressed)
| |
-<---------------pop back to login--------------<-
モーダルに表示されたナビゲーションコントローラーを閉じる時が来たことを最初のログインビューに通知するために、委任を試みましたが、エラーが発生しました:
2012-09-10 11:13:05.749 KITxWebMobileJSONv4[1138:f803] attempt to dismiss modal view controller whose view does not currently appear. self = <UINavigationController: 0x68c6150> modalViewController = <UserDashboardViewController: 0x68d9fb0>
2012-09-10 11:13:05.749 KITxWebMobileJSONv4[1138:f803] attempt to dismiss modal view controller whose view does not currently appear. self = <UserLoginViewController: 0x688ffa0> modalViewController = <UINavigationController: 0x68c6150>
ログイン ビューの委譲は次のようになります。
// This method is called from the UserMenuTableViewController, when it's time to log out:
- (void)userMenuTableViewController:(UserMenuTableViewController *)sender
loggedOut:(BOOL)didLogOut
{
if (didLogOut) {
/* delete user info and take care of data on backend:
* ...
*/
// pop navigation controller, presenting the initial Login View:
[self dismissModalViewControllerAnimated:YES]; // THIS LINE FIRES AND GETS THE ERROR ABOVE
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Login Success"]) { // successful login:
// set (UINavigationController *)self.nav to the segue destination (for a handle, if needed):
self.nav = (UINavigationController *)segue.destinationViewController;
// grab the user menu and set self to be it's delegate:
UserMenuTableViewController *userMenu = [self.nav.viewControllers lastObject];
userMenu.delegate = self;
}
}
前もって感謝します!