无需返回按钮即可推送到 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];
【问题讨论】:
不要在StoryBoard
或AppDelegate
中实现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 手动点击按钮时推送到详细视图控制器;再次返回,然后作为数据源数组的计数推送?