【问题标题】:Unwind segue with Navigation back button使用导航返回按钮放松 segue
【发布时间】:2012-11-13 03:47:56
【问题描述】:

我已经观看了关于情节提要实现的 Apple 演示视频,并在主视图上使用自定义按钮观看了演示。效果很好。

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

但是,我希望有一个正常的 push 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 方法很感兴趣

【问题讨论】:

    标签: xcode storyboard segue


    【解决方案1】:

    最后我不需要解开 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;
    

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

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

    【讨论】:

    • 好主意,如果您的视图控制器也可以继续前进,可能会出现问题。或者,如果您有另一个可以在此之上触发的模式。
    • 我有同样的问题,我正在使用 Swift。你能在 Swift 中提供上述解决方案吗?谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可能没有考虑过的另一种方法是让父级成为子级的委托,并在子级中使用委托方法来更新父级。

        这样您就无需添加导航展开,因为在您回击时父级已经是最新的。

        【讨论】:

          猜你喜欢
          • 2013-06-17
          • 2014-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多