SWRevealViewController - вручную переключиться на другой режим?
У меня есть меню боковой панели, сделанное с помощью SWRevealViewController.
Одним из элементов меню на боковой панели является "вход". Он открывает вход в систему (через пользовательский сегмент SWRevealViewController).
Я хочу программно переключиться на другое представление после успешного входа пользователя. Как это сделать?
UPDATE, мой код:
ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
SWRevealViewController *revealController = self.revealViewController;
[revealController setFrontViewController:vc animated:YES];
После этого я получаю только пустой экран. Что я делаю не так? Я чувствую, что это неправильно:
ViewController *vc = [[ViewController alloc] init];
так что это правильный способ доступа к уже загруженному диспетчеру просмотра? (он загружается при запуске приложения с помощью SWRevealViewController в качестве фронтального контроллера)
Ответы
Ответ 1
Использование
- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
метод
У SWRevealController есть собственная собственность, с которой вы можете получить доступ с любого UIViewController:
SWRevealViewController *revealController = self.revealViewController;
Вы можете проверить примеры проектов в репозитории GitHub:
https://github.com/John-Lluch/SWRevealViewController
Ответ 2
Попробуйте следующее:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[navController setViewControllers: @[rootViewController] animated: YES];
[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
работайте для меня: -)
Ответ 3
Попробуйте следующее:
ViewController *vc = [[ViewController alloc] init]; // this is main front ViewController
UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[vc] animated: YES];
// [navController pushViewController:vc animated:YES]; // use this if you want to stack the views
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
Ответ 4
Вот версия Swift версии SetFrontViewController:
if let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("SecondViewControllerStoryBoardID") as? SecondViewController {
let navController = UINavigationController(rootViewController: secondViewController)
navController.setViewControllers([secondViewController], animated:true)
self.revealViewController().setFrontViewController(navController, animated: true)
}
Ответ 5
Существует новый API - (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated;
Насколько я знаю, это самый элегантный способ, который анимирует правильное переключение между контроллерами представлений вручную.
// get the view controller you want to push to properly.
// in this case, I get it from Main.storyboard
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController * vc = [sb instantiateViewControllerWithIdentifier:@"SignInViewController"];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:vc];
[navController setViewControllers: @[vc] animated:NO];
[self.revealViewController pushFrontViewController:navController animated:YES];
Если вы находитесь в целевом vc, который не импортирует SWRevealViewController
и хочет отменить:
// get your vc properly
[self.navigationController setViewControllers:@[vc] animated:YES];
Обратите внимание, что [self.navigationController showViewController:vc sender:self];
имеет тот же результат, но не использует его, так как это создает новый диспетчер представлений в стеке навигации, что в основном бессмысленно при использовании SWRevealViewController
.
Ответ 6
Это отлично работает для меня.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *rootViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"NavController"];
[navController setViewControllers: @[rootViewController] animated: YES];
[self.revealViewController setFrontViewController:navController];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
Ответ 7
@Evana имеет хороший ответ, однако для моего случая, передающего параметр destViewController, мне нужно улучшить его, как показано ниже. Следуя ее примеру, я заметил, что DestViewController viewDidLoad вызывается дважды. Сначала с 0 на "selectedId", только второй вызов сделал "selectedId", получив мое значение тега.
Таким образом, для более чистой навигации, DestViewController должен быть получен с navController, так что нет избыточного вызова.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"DestNavController"];
DestViewController *destViewController = (DestViewController*)[[navController viewControllers] objectAtIndex:0];
destViewController.selectedId = ((UIButton*)sender).tag;
[self.revealViewController setFrontViewController:navController];