2

这是我的故事板
故事板 正如所指出的,我添加了一个注销按钮,以到达第一个视图。

当应用程序启动时,它看起来像这样:
开始
登录后,它转到一个选项卡栏,如下所示:
登出
我已将“注销”按钮与第一个视图连接并选择了推送。但是当我按下“注销”时,会发生这种情况:
错误
我希望登录视图按原样显示,但标签栏出现,还有一个“后退”按钮,我不希望它出现。
*前 3 个选项卡项有自己的导航控制器,注销按钮位于第一个选项卡项上。

4

2 回答 2

5

更新
我现在明白 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];

会得到你所追求的。

于 2013-01-12T19:41:16.713 回答
2

我您对所有视图控制器使用相同的导航,然后首先从导航堆栈中找出第一个 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类的发布通知是相同的

于 2013-01-12T19:44:56.570 回答