我无法将这些拼凑在一起。我有一个视图控制器打开另一个(将其推送到导航堆栈)。在该呈现的视图控制器上,用户在文本视图中输入值。当用户在导航中按下后退按钮时,我希望能够将他们在文本视图中输入的值传递回演示控制器。
我已经找到了一种方法来使用unwind segue和后退按钮但没有找到任何东西。当我创建我的后退按钮(以编程方式)时,我使用initWithTitle:style:target:action但我不确定如何实现action方法,我将能够访问所提供的控制器中的值集。可能必须使用委托来链接这两者,但不确定这种情况的确切集成点。
我觉得我离这儿很近,一点帮助就能让我在那里。谢谢!
答案 0 :(得分:2)
用于此交互的两个最常见的模型是子视图控制器具有委托或完成块。要么在prepareForSegue方法中设置。我个人的偏好是完成块方法,因为它保留了代码,但是ymmv。
还有多个模型可用于检测您的子视图控制器何时被解除,并且您需要调用该委托和/或完成:
使用自定义后退按钮。不是这个的粉丝,因为创建一个真正看起来和像Apple原版一样的后退按钮可能是一个问题,特别是如果支持iOS 6和iOS 7。
挂钩viewDidDisappear并查看您是否仍在导航控制器的viewControllers数组中。这是更好的,因为后退按钮工作正常,但它仍然感觉有点好。
使用UINavigationBarDelegate方法navigationBar:shouldPopItem:
这很有吸引力,特别是如果您需要进行其他验证,例如检查已保存/未保存的值。要实现这一点,你必须继承UINavigationController并将方法转发给你的子视图控制器。
编辑:选项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
或使用带<的图像。本身。