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)