Push View из представленного контроллера просмотра в iOS
Короче:
Как я могу использовать PushViewController из представленного ViewController?
Вкратце:
У меня есть MainViewController
, в котором у меня есть одна кнопка при нажатии кнопки, я представляю представление под названием LoginViewController
.
На этой странице (LoginViewController
) у меня снова есть button
, по щелчку этого, я пытаюсь нажать мой контроллер представления (называемый HomeViewController
), который он не толкает.
Вот мой фрагмент кода,
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
[self presentViewController:vc animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Но это не сработало для меня. Кроме того, я напечатал a stack of view controllers
до pushed
, но у него нет LoginViewController
. Итак, не добавляя LoginViewController
в a stack of view controllers
, как я могу pushed
до HomeViewController
от LoginViewController
?
Когда я получаю сообщение от HomeViewController
, тогда LoginViewController
должен быть открыт..
Можно ли использовать этот одиночный NavigationController
?
Примечание: - Здесь я только что привел пример, используя Login, Home и Main ViewController. Но я хочу, чтобы это было в других экранах.
Ответы
Ответ 1
Вы должны Push
от вашего firstView (MainViewController
), но вы можете использовать анимацию так же, как PresentView
и DismissView
. Используйте следующий код для этого: -
Для Push (on MainViewController
)
LoginViewController *VC = [[LoginViewController alloc]init];
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionMoveIn;
transition.subtype = kCATransitionFromTop;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[[[UINavigationController alloc] initWithRootViewController:VC] pushViewController:VC animated:NO];
//[self.navigationController pushViewController:VC animated:NO];
Для Pop (on LoginViewController
)
CATransition* transition = [CATransition animation];
transition.duration = 0.3f;
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromBottom;
[self.navigationController.view.layer addAnimation:transition
forKey:kCATransition];
[self.navigationController popViewControllerAnimated:NO];
Используя этот код, вы можете получить анимацию так же, как Present-Dismiss ViewControllers
. Подробнее см. этот ответ.
И после этого вы можете использовать свой код для Pushing
LoginViewController
до HomeViewController
Надеюсь, это то, что вы ищете. Меня волнует любая забота.:)
Ответ 2
привет, когда вы представляете контроллер входа в систему. Просто представьте навигационный контроллер, например:
LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];
Теперь ваш PresentedViewController является навигационным контроллером
теперь вы можете просто нажать на свой домашний VC
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
Надеюсь, что это поможет вам.
Ответ 3
LoginViewController
не следует вводить в стек контроллера навигации. Позвольте мне описать ниже "почему".
Наш MainViewController
должен быть в стеке - вы всегда хотите вернуться туда.
// AppDelegate.m (only if you don't use storyboards, if you do - you don't need to copy this part of code)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// create the window
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setBackgroundColor:[UIColor whiteColor]];
[self.window makeKeyAndVisible];
// set view controllers
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];
[self.window setRootViewController:navigationController];
}
В конкретном действии show LoginViewController
. Вы не хотите, чтобы пользователь мог нажать back
и перейти к MainViewController
. Позже вы не захотите, чтобы пользователь вернулся к LoginViewController
. Из-за этого вам нужно представить его как модальный:
// inside `MainViewController.m`
- (IBAction)myCoolActionToShowLogin:(id)sender {
[self presentViewController:[[LoginViewController alloc] init] animated:YES completion:nil];
}
Теперь мы можем видеть LoginViewController
. Когда пользователь завершит вход в систему, отпустите его и представите HomeViewController
:
// inside `LoginViewController.m`
- (IBAction)myAwesomeActionToShowHome:(id)sender {
UINavigationController *navigationController = (UINavigationController *)[UIApplication.sharedApplication.keyWindow rootViewController];
[navigationController pushViewController:[[HomeViewController alloc] init] animated:YES];
[self dismissViewControllerAnimated:YES completion:nil];
}
ПРИМЕЧАНИЯ:
Как вы можете заметить, myAwesomeActionToShowHome:
ожидает, что у вас есть контроллер навигации в качестве rootViewController
. Это работает, но должно быть лучше - вы должны проверить, является ли эта навигация фактически навигационным контроллером, а не его литьем. Или вы можете создать делегат или блок для ввода нового. Это самое быстрое и легкое рабочее решение, которое должно быть улучшено позже.
Вы действительно должны читать: Apple Developer → Документация по программированию "Просмотр контроллера" , так как это < сильные базовые принципы, которые вы должны знать, чтобы правильно разработать и спроектировать UX.
Вот пример рабочего примера .
Ответ 4
Вы не можете нажать с представленного контроллера представления. Я предлагаю вам сохранить свою навигационную иерархию.
Для этого с вашего MainViewController вы должны представить LoginViewController, и вы должны передать контроллер навигации для MainViewController.
- (IBAction)openLogin:(id)sender {
LoginViewController *loginVC = (LoginViewController *) [self.storyboard instantiateViewControllerWithIdentifier:@"login"];
[loginVC setReferencedNavigation:self.navigationController];
[self presentViewController:loginVC animated:YES completion:nil];
}
Затем внутри LoginViewController вы должны нажать на HomeViewController, как это,
LoginViewController.h
@interface LoginViewController : UIViewController {
UINavigationController *refNavigationController;
}
- (void) setReferencedNavigation:(UINavigationController *)refNavCon;
LoginViewController.m
- (void) setReferencedNavigation:(UINavigationController *)refNavCon {
refNavigationController = refNavCon;
}
- (IBAction)openHome:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{
UIViewController *homeVC = [self.storyboard instantiateViewControllerWithIdentifier:@"home"];
[refNavigationController pushViewController:homeVC animated:YES];
}];
}
Сделав это, он будет выглядеть так, как вы нажимаете LoginLogController, но на самом деле вы нажимаете MainViewController.
Вы можете настроить этот подход для поддержки анимации и пользовательского интерфейса для этого потока.
![введите описание изображения здесь]()
Ответ 5
1) представить в качестве контроллера представлений контроллер корневого представления navigation controller with its
.
- (IBAction)LoginClicked:(id)sender
{
LoginViewController *loginViewController = [LoginViewController alloc] init];
UINavigationController *navController = [UINavigationController alloc] initWithRootViewController:loginViewController];
[self presentViewController:navController animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender
{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Надеюсь, что это сработает для вас.
Ответ 6
Проблема заключается в том, что LoginViewController
не имеет контроллера навигации. Затем вы дадите его.
MainViewController.m
Создайте UINavigationController
, поместите LoginViewController
в стек и представите UINavigationController
.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController = nav = [[UINavigationController alloc] init];
nav.viewControllers = @[vc];
[self presentViewController:nav animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Отклонить
Вызовите dismissViewControllerAnimated
в MainViewController
.
Ответ 7
Создайте экземпляр UINavigationController
[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]
Представьте, что navigationController, а затем нажмите любой VC, который вы хотите.
Ответ 8
MainViewController.m
- (IBAction)LoginClicked:(id)sender {
LoginViewController *vc = [[LoginViewController alloc] init];
UINavigationController *loginNav = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:loginNav animated:YES completion:nil];
}
LoginViewController.m
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
NSLog(@"viewControllers %@",APPDELEGATE.nav.viewControllers);
//LoginViewController is not in this array
HomeViewController *obj = [[HomeViewController alloc] init];
[self.navigationController pushViewController:obj animated:YES];
}
Ответ 9
Это очень простой код для текущего контроллера представлений и контроллера представления.
- (IBAction)LoginClicked:(id)sender {
LoginViewController *objLogicVC = [LoginViewController alloc] init];
UINavigationController *navPresent = [UINavigationController alloc] initWithRootViewController:objLogicVC];
[self presentViewController:navPresent animated:YES completion:nil];
}
- (IBAction)buttonActionMethodOnLoginView:(id)sender{
HomeViewController *objHomeVC = [[HomeViewController alloc] init];
[self.navigationController pushViewController:objHomeVC animated:YES];
}
Ответ 10
просто поместите этот код в цель c на кнопку действие
UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];
[[self navigationController] pushViewController:yourViewControllerName animated:YES];
Ответ 11
Для Swift 3.0
Представьте свой контроллер представления как новый rootViewController
let navController = UINavigationController.init(rootViewController: self.storyboard!.instantiateViewController(withIdentifier: "SignInViewController"))
self.present(navController, animated: true, completion: {})
Теперь нажмите контроллер вида из представленного контроллера представления
self.show(self.storyboard!.instantiateViewController(withIdentifier: "SignUpViewController"), sender: self)