使用导航后退按钮展开segue

时间:2012-11-25 14:09:36

标签: xcode storyboard segue

我通过展开segues部分观看了有关故事板实现的苹果演示视频,并使用主视图上的自定义按钮观看了演示。这很好。

我也看到过这个相同的事情的一个很好的例子也有效。 http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues

但是,我希望有一个正常的推送segue从父级(带有主窗体数据)传递到子级(带有高级设置选项),然后使用导航栏中的后退按钮返回到父视图控制器,而不是使用视图中的自定义按钮,如演示中所示。当父控制器上的另一个保存按钮被按下时,父控制器将所有内容保存到API服务器。

我似乎无法覆盖导航后退按钮以将其指向我的展开segue动作,并且由于后退按钮没有出现在故事​​板上,我无法将绿色的“退出”按钮拖到它上面

我在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 unwind segue方法

4 个答案:

答案 0 :(得分:14)

最后我不需要解开segue,因为我仍然可以通过跟随导航控制器获得对父控制器方法的引用。

我可以通过在子控制器的- (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;

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

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

答案 1 :(得分:6)

@Alan走在正确的轨道上。只需添加一个测试,以防止在不返回第一个视图控制器时触发segue。 viewWillDisappear中的这样的东西实际上允许你为后退按钮执行展开segue。您需要通过从类向下拖动到退出图标来创建手动展开segue。请务必在创建后为其命名。

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

答案 2 :(得分:5)

我想添加一个遵循@Chuck H建议的Swift解决方案:

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

答案 3 :(得分:1)

您可能未考虑的替代方法是使父级成为子级的委托,并使用子级中的委托方法来更新父级。

这样你就可以绕过添加到导航展开的需要,因为父级在你回击的那一刻已经是最新的了。