-segueForUnwindingToViewController:fromViewController:identifier:未被调用

Fáb*_*ira 23 objective-c ios segue

我创建了一个自定义segue,它在容器内部提供了一个与Apple自己的模态视图控制器非常相似的视图控制器(我已经将它实现为UIViewController子类).

我现在正在尝试创建一个自定义展开segue但是我无法获得-segueForUnwindingToViewController: fromViewController: identifier:要调用的方法.

我也在-viewControllerForUnwindSegueAction: fromViewController: withSender:我的容器上实现,所以我可以指向正确的视图控制器(呈现此模式的那个)但是应该被要求我的自定义展开segue的方法不会被调用到任何地方.

现在,我解除这种模式的唯一方法是在-returned:方法上做到这一点.

有没有人可以通过自定义展开segue成功完成此操作?


编辑:更多的代码和上下文

我的展开视图控制器在故事板中配置,而不是以编程方式配置.

我有这些与我的控制器中的展开segue相关的代码:

PresenterViewController.m

我在这里使用自定义方法来解除我的自定义模态(-dismissModalViewControllerWithCompletionBlock:).

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController
                                      fromViewController:(UIViewController *)fromViewController
                                              identifier:(NSString *)identifier {
    return [[MyModalUnwindSegue alloc] initWithIdentifier:identifier
                                                   source:fromViewController
                                              destination:toViewController];
}

-(IBAction)returned:(UIStoryboardSegue *)segue {
    if ([segue.identifier isEqualToString:@"InfoUnwindSegue"]) {
        [self dismissModalViewControllerWithCompletionBlock:^{}];
    }
}
Run Code Online (Sandbox Code Playgroud)

MyModalViewController.m

这里我只用-viewControllerForUnwindSegueAction: fromViewController: withSender:指向我应该放松的视图控制器.

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action 
                                      fromViewController:(UIViewController *)fromViewController 
                                              withSender:(id)sender {
    return self.myPresentingViewController;
}
Run Code Online (Sandbox Code Playgroud)

我期待的行为是调用MyModalViewController指向应该处理展开的视图控制器,然后这个视图控制器在-segueForUnwindingToViewController: fromViewController: identifier:调用之前-returned:调用了他的方法.

现在-segueForUnwindingToViewController: fromViewController: identifier:永远不会被召唤.

我还必须说我已经尝试过不同的配置.无处不在,我把我的方法用来返回它从未被调用的unwind segue.我已经读过我可以子类化导航控制器,然后它被调用,但我不知道它如何适合我的解决方案.


编辑2:附加信息

我已经检查过MyModalViewController -segueForUnwindingToViewController: fromViewController: identifier:在我想要解除它提供的常规模态视图控制器时调用了他的方法.这可能是因为他是层次结构中最顶层的UIViewController.

检查完之后,我已将UINavigationController子类化,并使用此子类来包含我的PresenterViewController.我很惊讶地注意到他的-segueForUnwindingToViewController: fromViewController: identifier:方法也被调用了.

我相信只有作为容器的视图控制器才会调用此方法.这对我来说没什么意义,因为他们不是唯一提出其他视图控制器的人,他们的孩子也在这样做.

我不能在这个子类中创建逻辑来选择要使用的segue类,因为这个类不知道他们的孩子做了什么.

苹果论坛暂时停滞不前,现在无法获得他们的支持.如果有人有任何关于如何工作的信息,请帮助!我想缺少这方面的文档是一个很好的指标,表明这仍然是多么不稳定.

Ben*_*ton 11

为了添加@Jeremy的答案,我从一个模态UIViewController展开到UINavigationController中包含的UIViewController,以便在我的UINavigationController子类中使用以下内容正常工作(即我的预期).

// Pass to the top-most UIViewController on the stack.
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)
             toViewController fromViewController:(UIViewController *)
             fromViewController identifier:(NSString *)identifier {
   UIViewController *controller = self.topViewController;
   return [controller segueForUnwindingToViewController:toViewController
                                  fromViewController:fromViewController
                                          identifier:identifier];
}
Run Code Online (Sandbox Code Playgroud)

..然后像往常一样在UINavigationController内的实际ViewController中实现segueForUnwindingToViewController.


Jer*_*sel 5

应在父控制器上声明此方法.因此,如果您正在使用具有自定义segue的导航控制器,请将UINavigationController子类化并在其上定义此方法.如果您希望在其中一个UINavigationController的子视图上定义它,您可以覆盖UINavigationController上的canPerformUnwindSegueAction:fromViewController:withSender,让它搜索子进程的处理程序.

如果您正在使用嵌入视图(容器视图),请在父视图控制器上定义它.

查看WWDC 2012 Session 407的最后10分钟 - 在您的应用程序中采用故事板以了解其工作原理!