推送到没有后退按钮的ViewController

我正在开发一个包含登录/身份validationfunction的iOS应用程序 – 基本上是用户首次登录,他们需要输入相关的登录详细信息 – 然后将它们传递到主应用程序屏幕 – 随后访问应用程序,他们将自动进行身份validation。

以上所有工作正常 – 我的问题是导航栏 – 它出现在应用程序主要部分的主屏幕中,带有一个后退按钮 – 我不希望这个显示,因为他们不应该返回经过身份validation后登录屏幕。 我想它是使用根导航控制器来解释逻辑,但是有一种方法可以忽略登录部分的导航控制器,因此后退按钮不会显示在主应用程序中。

下面是帮助我解释的结构的截图 – 左手组的屏幕是登录过程右手是主要的app结构。

在此处输入图像描述

用于切换屏幕的代码如下 –

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

在登录后实现的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]; } } 

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

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

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

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

您可能也可能不会从根目录中删除模态视图 – 如果这样做,您将需要能够从loginViewController调用dismiss例程,但是还有其他方法可以将dismiss放在模态视图中(loginViewController)

  • (void)login_exit:(BOOL)success {[self dismissViewControllerAnimated:YES completion:NULL];

    if!(成功){
    ….发送消息(UIAlertview并询问他或她是否想再试一次)} else {} return;}

很简单..只需导航到rootviewcontroller

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

在viewDidLoad方法中写这个

 self.navigationItem.hidesBackButton = YES; 

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

目标C.

 self.navigationController.navigationBarHidden = true; 

迅速

 self.navigationController?.navigationBarHidden = true; 

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

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

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

你必须在push之后隐藏navigationItem,否则它将是nil。