无需返回按钮即可推送到 ViewController

Posted

技术标签:

【中文标题】无需返回按钮即可推送到 ViewController【英文标题】:Push to ViewController without back button 【发布时间】: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 【参考方案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。

【讨论】:

以上是关于无需返回按钮即可推送到 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

通过按钮推送到 laravel 上的 jquery ajax 返回视图返回到部分动态变化

如何通过 didselectrow 手动点击按钮时推送到详细视图控制器;再次返回,然后作为数据源数组的计数推送?

facebook 如何将数据推送到新闻提要?

推送到另一个视图后,如何让这个 ios 按钮在提要视图中保持可见?

从 github 推送到 heroku,无需下载 repo

如何使用ajax将数据推送到数组