Как отключить несколько presentModalViewControllers и вернуться к корневому контроллеру панели вкладок?

#iphone #ios #delegates #uiviewcontroller #modal-dialog

#iPhone #iOS #делегаты #uiviewcontroller #модальный диалог

Вопрос:

У меня есть приложение, которое показывает presentModalViewController при запуске.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    Overview *overviewViewController = [[Overview alloc] initWithNibName:@"Overview" bundle:nil];
    [self.tabBarController presentModalViewController:overviewViewController animated:YES];
    [overviewViewController release];
    [self.window makeKeyAndVisible];
    return YES;
}
  

Как только отображается overviewController, пользователь может войти в систему или зарегистрироваться. Если они выбирают login, то я использую другой presentModalViewController, который позволяет им входить в систему:

   -(IBAction) btnLoginPressed{

//  [self dismissModalViewControllerAnimated:YES];
    Login *loginOverView = [[Login alloc] initWithNibName:@"Login" bundle:nil];
    [self presentModalViewController:loginOverView animated:YES];
    [loginOverView release];


}
  

Однако при успешном входе в систему я хочу, чтобы оба presentModalViewController исчезли, что позволило мне вернуться к корневому контроллеру, который является контроллером панели вкладок.

Я пытался сделать следующее, но это не работает:

 -(IBAction) btnSubmitLoginPassword{

    //make web service call
//  [self dismissModalViewControllerAnimated:YES];
    [self.tabBarController dismissModalViewControllerAnimated:YES];
}
  

Теперь, когда я гуглю, я наткнулся на концепцию делегатов, с которой я не знаком. Может ли кто-нибудь уделить время, чтобы помочь мне в моей дилемме.

Заранее спасибо

Ответ №1:

Контроллеры просмотра организованы в стек. Вы используете методы UINavigationController popToRootViewControllerAnimated: или popToViewController:animated: для управления количеством просмотров, которые должны отображаться в верхней части стека.

Вы можете получить доступ к экземпляру UINavigationController через делегата вашего приложения.

Чтобы переместить все контроллеры просмотра в корневой контроллер просмотра: (я думаю, это то, о чем вы спрашиваете)

 UIApplicationDelegate* delegate = [[UIApplication sharedApplication] delegate];
[delegate.navigationController popToRootViewControllerAnimated:YES];
  

Чтобы переместить все контроллеры просмотра в известный контроллер просмотра в стеке:

 UIApplicationDelegate* delegate = [[UIApplication sharedApplication] delegate];
[delegate.navigationController popToViewController:popToViewController animated:YES];
  

Комментарии:

1. Это будет работать с любым типом представления, хотя я не знаю, что вы подразумеваете под «модальными представлениями»…

2. Я имею в виду контроллеры просмотра, которые были загружены путем вызова метода presentModalViewController:animated.

3. Извините, я пропустил, что вы используете presentModalViewController. На самом деле я не знаю, но это то, что я хочу понять… Нет. Почему бы вам не изменить свой код, чтобы вместо этого использовать pushViewController: animated:?

4. Я не тот человек, который задал вопрос.

Ответ №2:

Добавьте id delegate; и @property (nonatomic, retain) id delegate; в свой обзор.h. Добавьте @synthesize delegate в свой обзор.m. Затем добавьте следующее после вашего initWithNibName:bundle :

 [overviewViewController setDelegate: self];
  

Сделайте то же самое для вашего класса Login:
Добавьте id delegate; и @property (nonatomic, retain) id delegate; в свой Login.h. Добавьте @synthesize delegate в свой Login.m. Затем добавьте следующее после вашего initWithNibName:bundle :

 [overviewViewController setDelegate: self];
  

Добавьте следующий метод в свой обзор.m:

 - (void)dismissLoginView {
    [self dismissModalViewControllerAnimated: NO];
    [delegate dismissModalViewControllerAnimated: YES];
}
  

Измените свой -(IBAction) btnSubmitLoginPassword на

 -(IBAction) btnSubmitLoginPassword {
    [delegate dismissLoginView];
}
  

Я это не тестировал. Я надеюсь, что это работает! Дайте мне знать, когда нет.