这是我的故事板
正如所指出的,我添加了一个注销按钮,以到达第一个视图。
当应用程序启动时,它看起来像这样:
登录后,它转到一个选项卡栏,如下所示:
我已将“注销”按钮与第一个视图连接并选择了推送。但是当我按下“注销”时,会发生这种情况:
我希望登录视图按原样显示,但标签栏出现,还有一个“后退”按钮,我不希望它出现。
*前 3 个选项卡项有自己的导航控制器,注销按钮位于第一个选项卡项上。
这是我的故事板
正如所指出的,我添加了一个注销按钮,以到达第一个视图。
当应用程序启动时,它看起来像这样:
登录后,它转到一个选项卡栏,如下所示:
我已将“注销”按钮与第一个视图连接并选择了推送。但是当我按下“注销”时,会发生这种情况:
我希望登录视图按原样显示,但标签栏出现,还有一个“后退”按钮,我不希望它出现。
*前 3 个选项卡项有自己的导航控制器,注销按钮位于第一个选项卡项上。
更新
我现在明白 TabBarController 是从 loginController呈现的。
那么正确的返回方式是:
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
我将留在下面的注释中,他们假设我们正在处理 UINavigationController 层次结构。还是值得一读!
这是一个部分答案......在我写完之后我意识到你的标签栏控制器不是你的登录 NavController 堆栈的一部分(我不这么认为),所以它不会工作 - 但你还是应该阅读它了解为什么 Segue/PUSHing 不是要走的路。
稍后我会为您的案例提供更准确的答案...
您不想使用 segue 或 PUSH ... 将其想象成一堆卡片,推送是将更多卡片添加到堆栈中,因此您将登录屏幕的一个版本添加到您的 NavController 堆栈中包含在您的标签栏控制器中。这与您已经创建的登录屏幕实例不同,它是一个新实例(推送创建一个新实例)。
您想从堆叠中移除卡片并返回您的第一张卡片。那是一个POP操作。
其中之一将起作用。
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
它们是UINavigationController
方法。您可以UIViewController
像这样从最顶层访问它们:
[self navigationController] popToRootViewControllerAnimated:NO;
[self navigationController] popToViewController:myLogInViewController animated:YES;
您可以通过在 viewController 中放置 IBAction 从注销按钮触发它们。
看起来你想要返回的 viewController 确实是你的根视图控制器,所以试试看它是否有效。如果没有,您将需要对要返回的 viewController 的引用。你可以通过计算堆栈来做到这一点。堆栈作为viewControllers
导航控制器的数组属性访问。例如,如果它是从 rootViewController 向上的第二个 viewController,
UIViewController* logInViewController =
[[self navigationController] viewControllers] objectAtIndex:1];
会得到你所追求的。
我您对所有视图控制器使用相同的导航,然后首先从导航堆栈中找出第一个 viewController 对象并弹出到该视图。
例如:
-(void)popToSelectedViewController
{
NSArray *viewC=[self.navigationController viewControllers];
FirstViewC *firstVC=nil;
for (int i=0; i<[viewC count]; i++)
{
UIViewController *tempVC=[viewC objectAtIndex:i];
if([tempVC isKindOfClass:[FirstViewC class]])
{
firstVC=[viewC objectAtIndex:i];
break;
}
}
if(firstVC)
[self.navigationController popToViewController:firstVCanimated:YES];
else
[self.navigationController popToRootViewControllerAnimated:YES];
}
该方法将在导航堆栈中找到您的第一个 VC 并弹出到该视图。
我希望这会帮助你。
编辑后的另一个答案:
请在您的故事板中将编辑后的图像称为 N1 和 N2 类。我不知道这个类的名字,所以我把它写成 N1 和 N2。
在 N2 类中添加通知:将其写入 N2 类的 View DidLoad
-(void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(popToRooToview) name:@"PopView" object:nil];
//other stuffs
}
并将通知选择器定义为:
-(void)popToRooToview
{
[self.navigationController popViewControllerAnimated:YES];
}
在 viewDidUnLoad 中删除通知观察者
-(void)viewDidUnload
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"PopView" object:nil];
}
现在在您的 N1 类中单击 Logout Btn 调用此方法:
-(void)logoutButtonClicked
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"PopView" object:nil];
}
//记住通知名称“PopView”对于N1类的通知和N2类的发布通知是相同的