使用导航后退按钮展开segue

Ala*_*lan 31 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 :)];

是否可以使用后退按钮展开推送segue?

到目前为止我最好的想法是覆盖viewDidLoad方法中的后退按钮,但这会删除成角度的后退按钮样式,对于一个简单的问题看起来似乎是一个粗略的黑客

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

我知道有使用协议和委托的答案,但我有兴趣使用Xcode4.5展开segue方法

Ala*_*lan 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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好主意,如果您的视图控制器也可以继续前进,可能会有问题.或者如果你有另一个模态可以在这个上面触发. (2认同)

Chu*_*k H 6

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

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


Cla*_*lla 5

我想在上面的@Chuck H建议之后添加一个Swift解决方案:

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