Подтвердить что ты не робот

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 в качестве фронтального контроллера)

4b9b3361

Ответ 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];