【问题标题】:Push to ViewController without back button无需返回按钮即可推送到 ViewController
【发布时间】:2014-03-10 13:34:48
【问题描述】:

我正在开发一个包含登录/身份验证功能的 iOS 应用程序 - 基本上是用户第一次登录时,他们需要输入相关的登录详细信息 - 然后它们被传递到主应用程序屏幕 - 后续访问应用程序时,它们将自动已通过身份验证。

以上所有内容都可以正常工作-我遇到的问题是导航栏-它出现在应用程序主要部分的主屏幕中并带有后退按钮-我不希望显示它们,因为它们不应该显示验证后能够返回登录屏幕。我猜它使用了解释逻辑的根导航控制器,但是有没有办法忽略登录部分的导航控制器,所以后退按钮不会显示在主应用程序中。

下面是结构的屏幕截图以帮助我解释 - 左侧的屏幕组是登录过程,右侧是主要的应用程序结构。

用于切换画面的代码如下——

SWRevealViewController *swRevealController = (SWRevealViewController *)navVC;
swRevealController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:controller animated:YES];

【问题讨论】:

  • 不要在StoryBoardAppDelegate 中实现navigationController
  • 应该类似于this answer

标签: ios objective-c uinavigationcontroller


【解决方案1】:

不要推送视图控制器。创建新的层次结构:

目标-C

[self.navigationController setViewControllers:@[controller] animated:YES];

斯威夫特

navigationController.setViewControllers([controller], animated:true)

【讨论】:

  • 默认。 “重置”当前视图堆栈的最佳解决方案
【解决方案2】:

在登录后执行的Screen中,ViewDidLoad方法添加一行隐藏后退栏按钮。

self.navigationItem.hidesBackButton = YES;

此外,您可以添加一个“注销”选项

UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered
                                                                 target:self
                                                                 action:@selector(LogoutClick)];
self.navigationItem.leftBarButtonItem = backBarButton;

-(void)LogoutClick {
    [self showLogoutAlert];
}

-(void)showLogoutAlert {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@""
                                                message:@"Do you want to Logout ?"
                                                       delegate:self
                                              cancelButtonTitle:@"Cancel"
                                              otherButtonTitles:@"Logout", nil];
    [alert show];
}


- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 1) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
}

【讨论】:

    【解决方案3】:

    对登录屏幕使用模态视图控制器,因此它不是导航根目录中导航控制器层次结构的一部分,可能在视图中加载了 - 下面的示例代码:

      - (void) viewDidLoad {
    ......
      LoginVC *loginViewController = [LoginVC alloc] init];
      loginViewController.parent = self;  
      [self presentViewController: loginViewController animated:YES completion:NULL];
      return;
          }
    

    您可能会或可能不会从根目录中关闭模态视图 - 如果这样做,您将需要能够从 loginViewController 调用关闭例程,但还有其他方法,您可以将关闭放在模态视图中(登录视图控制器)

    • (void) login_exit:(BOOL)成功{ [selfdismissViewControllerAnimated:YES 完成:NULL];

      如果!(成功){
      .... 发送消息(UIAlertview 并询问他或她是否想再试一次) } 别的 { } 返回;}

    【讨论】:

      【解决方案4】:

      非常简单.. 只需导航到 rootviewcontroller

       SWRevealViewController *swRevealController = (SWRevealViewController *)navVC;
       swRevealController.managedObjectContext = self.managedObjectContext;
       //-- I think above lines not needed as per your question
       [self.navigationController popToRootViewControllerAnimated:YES];
      

      【讨论】:

        【解决方案5】:

        在 viewDidLoad 方法中写这个

        self.navigationItem.hidesBackButton = YES;
        

        【讨论】:

          【解决方案6】:

          在使用 viewDidLoad 中的以下行推送 SWRevealViewController 之前,您需要在 ViewController 中隐藏导航栏

          目标 C

          self.navigationController.navigationBarHidden = true;
          

          斯威夫特

          self.navigationController?.navigationBarHidden = true;
          

          它不会在下一个被按下的视图控制器中显示后退按钮

          【讨论】:

            【解决方案7】:

            这将隐藏第一个视图的后退按钮。

            ClassA* controller = [storyboard instantiateViewControllerWithIdentifier:@"ClassAIdentifier"];
            
            if (controller != nil) {
                    [self.navigationController pushViewController:controller animated:YES];
                    [controller.navigationItem setHidesBackButton:YES animated:NO];    
                }
            

            推送后必须隐藏navigationItem,否则为nil。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-08-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-08-14
              • 2017-09-29
              相关资源
              最近更新 更多