#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];
}
Я это не тестировал. Я надеюсь, что это работает! Дайте мне знать, когда нет.