it-roy-ru.com

Push View из Представленного Контроллера Представления в iOS

Короче говоря: Как я могу PushViewController из Presented 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. Но я хочу это в других экранах.

25
Meet Doshi

Вы должны Push из вашего первого вида (MainViewController), но вы можете использовать анимацию так же, как PresentView и ​​DismissView. Используйте следующий код для этого: -

Для Push (на 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 (на 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. Обратитесь этот ответ для более подробной информации.

И после этого вы можете использовать свой код для PushingLoginViewController до HomeViewController

Надеюсь, это то, что вы ищете. Любое беспокойство вернуться ко мне. :)

3
Meet Doshi

привет, когда вы представляете свой контроллер представления входа Просто представьте навигационный контроллер, как:

LoginVC *loginVCObj =[[LoginVC alloc]initWithNibName:@"LoginVC" bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVCObj];
[self presentViewController:nav animated:YES completion:nil];

Теперь ваш PresentedViewController является контроллером навигации, теперь вы можете просто нажать на ваш домашний ВК

  HomeViewController *obj = [[HomeViewController alloc] init];
 [self.navigationController pushViewController:obj animated:YES];

Надеюсь, это будет полезно для вас

25
Shubham bairagi

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];
}

По конкретному действию покажите 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. Это работает, но должно быть лучше - вы должны проверить, является ли эта навигация контроллером навигации, а не приводить ее в действие. Или вы можете создать делегата или блок для Push нового. Это самое быстрое и простое рабочее решение, которое должно быть улучшено позже.

Вы действительно должны прочитать: Apple Developer -> документация "Просмотр программирования контроллера" , так как это основные принципы , которые вы должны знать, чтобы правильно разрабатывать и проектировать UX.

Вот рабочий демонстрационный образец .

11
Vive

Вы не можете нажать от представленного контроллера представления. Я предлагаю вам поддерживать навигационную иерархию.

Для этого из вашего 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];
    }];
}

Делая это, вы будете выглядеть так, как будто вы выталкиваете из LoginViewController, но в действительности вы выталкиваете из MainViewController.

Вы можете настроить этот подход для поддержки анимации и пользовательского интерфейса для этого потока.

enter image description here

9
Hemang

1) представить navigation controller with itsroot view controller`, установленный как контроллер вида.

- (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];
}

Надеюсь, это сработает для вас.

8
Rohit Pradhan

Проблема в том, что у 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.

6
ukim

Создайте экземпляр UINavigationController

[[UINavigationController alloc] initWithRootViewController:[[LoginViewController alloc] init]]

Представьте этот навигационный контроллер, а затем нажмите все, что захотите, VC).

4
Hunaid Hassan

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];
}
4
darshan

Это очень простой код для текущего контроллера просмотра и контроллера Push-просмотра.

- (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];
}
4
Bera Bhavin

просто поместите этот код в Цель C в кнопкадействие

UIViewController *yourViewControllerName = [self.storyboard instantiateViewControllerWithIdentifier:@"yourViewControllerName "];

[[self navigationController] pushViewController:yourViewControllerName  animated:YES];
3
iTALIYA

Для 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)
3
emraz