使用导航返回按钮的反向跳转取消操作

31

我已经观看了苹果演示视频,学习了关于使用 unwind segues 的 storyboard 实现,并且看到了在主视图上使用自定义按钮的演示。那个效果很好。

我也在这里看到了一个同样很好的例子,它也可以工作。http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues

然而,我希望有一个普通的 push segue 从父视图(带有主表单数据)传递到子视图(带有高级设置选项),然后通过导航栏上的返回按钮回到父视图控制器,而不是像演示中所示,在视图上使用自定义按钮。当在父控制器上按下进一步保存按钮时,父控制器将把所有内容保存到 API 服务器上。

我似乎无法覆盖导航返回按钮使其指向我的 unwind segue 操作,因为返回按钮不会出现在 storyboard 上,我无法将绿色 Exit 按钮拖动到它上面。

我尝试在 viewDidLoad 中重写操作,但它没有起作用。 [self.navigationItem.backBarButtonItem setAction:@selector(unwindSegueAction:)];

使用返回按钮解开 push segue 是否可行?

我目前想到的最好的办法是从 viewDidLoad 方法中覆盖返回按钮,但这会删除倾斜的返回按钮样式,而且似乎是一个简单问题的粗糙黑客方式。

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(unwindSegue:)];

我知道有使用协议和代理的解决方案,但我对使用Xcode4.5的返回展开(segue)方法更感兴趣。

4个回答

14

最终我不需要取消转场,因为我可以通过跟随导航控制器来获取对父控制器方法的引用。

在子控制器的- (void)viewWillDisappear:(BOOL)animated方法中执行以下操作即可获取引用。

NSInteger currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];

FirstViewController *parent = (FirstViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];

parent.barcodeType = indexPath.row;

它完美地将设置变量传回原始控制器。

我还在子控制器顶部添加了对父控制器的引用导入。


2
好主意,但如果您的视图控制器也可以前进,或者如果您有另一个模态可以在此之上触发,可能会出现问题。 - Daniel
我有同样的问题,我正在使用Swift。你能提供上述解决方案的Swift版本吗?谢谢! - Raghavendra

6

@Alan 步入正轨。只需添加一个测试以防止在不返回到第一个视图控制器时触发segue。像这样在 viewWillDisappear 中实际上允许您执行返回按钮的解缠 segue。您需要通过从类下拖动到退出图标来创建手动解缠segue。创建后请确保对其进行命名。

UIViewController *vc = self.navigationController.topViewController;
if ([FirstViewController class] == [vc class])
{
    [self performSegueWithIdentifier:@"unwindSegue" sender:self];
}

5
我可以提供一份遵循@Chuck H建议的Swift解决方案:

请注意,上面的代码中包含了一些HTML标签,我已经保留了它们。

let rootVC = self.navigationController!.topViewController
if rootVC.isKindOfClass(TheNameOfYourViewController) {
    performSegueWithIdentifier("yourNamedSegueIdentifier", sender: self)
}

1

你可能没有考虑过的另一种选择是将父视图设置为子视图的代理,并在子视图中使用代理方法更新父视图。

这样一来,你就可以避免添加导航取消的步骤,因为只要你返回页面,父视图就已经是最新的了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接