按下导航后退按钮时,返回值以显示视图控制器

时间:2014-03-19 16:52:42

标签: ios

我无法将这些拼凑在一起。我有一个视图控制器打开另一个(将其推送到导航堆栈)。在该呈现的视图控制器上,用户在文本视图中输入值。当用户在导航中按下后退按钮时,我希望能够将他们在文本视图中输入的值传递回演示控制器。

我已经找到了一种方法来使用unwind segue和后退按钮但没有找到任何东西。当我创建我的后退按钮(以编程方式)时,我使用initWithTitle:style:target:action但我不确定如何实现action方法,我将能够访问所提供的控制器中的值集。可能必须使用委托来链接这两者,但不确定这种情况的确切集成点。

我觉得我离这儿很近,一点帮助就能让我在那里。谢谢!

2 个答案:

答案 0 :(得分:2)

用于此交互的两个最常见的模型是子视图控制器具有委托或完成块。要么在prepareForSegue方法中设置。我个人的偏好是完成块方法,因为它保留了代码,但是ymmv。

还有多个模型可用于检测您的子视图控制器何时被解除,并且您需要调用该委托和/或完成:

  1. 使用自定义后退按钮。不是这个的粉丝,因为创建一个真正看起来和像Apple原版一样的后退按钮可能是一个问题,特别是如果支持iOS 6和iOS 7。

  2. 挂钩viewDidDisappear并查看您是否仍在导航控制器的viewControllers数组中。这是更好的,因为后退按钮工作正常,但它仍然感觉有点好。

  3. 使用UINavigationBarDelegate方法navigationBar:shouldPopItem:这很有吸引力,特别是如果您需要进行其他验证,例如检查已保存/未保存的值。要实现这一点,你必须继承UINavigationController并将方法转发给你的子视图控制器。

  4. 编辑:选项2的详细信息:

    -(void)viewDidDisappear:(BOOL)animated
    {
        [super viewDidDisappear:animated];
        if(![self.navigationController.viewControllers containsObject:self])
        {
            // We're not still in the navigation stack so we must've been
            //  popped.  If we were pushed, viewDidDisappear would be called
            //  but viewControllers containsObject:self would be true
        }
    }
    

    编辑:澄清选项3:在导航控制器子类中

    - (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
    {
        UIViewController*   top = self.topViewController;
        if([top respondsToSelector:@selector(navigationBar:shouldPopItem:)])
            return [(id)top navigationBar:navigationBar shouldPopItem:item];
        return [super navigationBar:navigationBar shouldPopItem:item];
    }
    

    然后,您可以在需要该功能的类中实现navigationBar:shouldPopItem:

答案 1 :(得分:1)

后退按钮实际上并没有提供与自身相关的任何事件,因此您可以在之前传递值并将其作为Popped ViewController。

您必须实现Delegate模式才能传递值。在这种情况下,当您按下backButton时无法捕获,您需要使用自定义leftBarButtonItem或使用带<的图像。本身。