-segueForUnwindingToViewController:fromViewController:identifier:未被调用

时间:2013-07-18 10:29:50

标签: ios objective-c 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:^{}];
    }
}

MyModalViewController.m

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

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

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

现在-segueForUnwindingToViewController: fromViewController: identifier:永远不会被调用。

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


编辑2:其他信息

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

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

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

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

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

4 个答案:

答案 0 :(得分: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];
}

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

答案 1 :(得分:5)

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

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

请参阅WWDC 2012会议407的最后10分钟 - 在您的应用中采用故事板以了解其工作原理!

答案 2 :(得分:0)

如果您正在使用UINavigationController且您的segue正在调用pushViewController,那么为了使用自定义展开segue,您需要继承UINavigationController并覆盖- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

假设我有一个名为CloseDoorSegue的自定义展开segue。我的UINavigationController子类实现可能类似于:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {

UIStoryboardSegue* theSegue;

if ([identifier isEqualToString:@"CloseDoor"]) {
    theSegue = [CloseBookSegue segueWithIdentifier:identifier source:fromViewController destination:toViewController performHandler:^(void){}];
} else {
    theSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}

return theSegue;

}

将您的UINavigationController子类设置为故事板中的导航控制器类。如果您使用" CloseDoor"正确设置了Exit事件,那么您应该很高兴。作为标识符。另外一定要打电话给'popViewControllerAnimated'在你的展开segue而不是解散,以保持与UINavigationControllers推/弹机制。

答案 3 :(得分:0)

iOS development Library 关于iOS开发库以及此方法的讨论。 - segueForUnwindingToViewController:fromViewController:identifier: 确保您的MyModalViewController是容器角色而不是容器的子控件。如果有类似[anotherVC addChildViewController:myModalViewController];的内容,则应将segueForUnwindingToViewController方法放在某种“AnotherVC.m”文件中。

  

讨论   如果您实现了一个自定义容器视图控制器   也使用segue展开,你必须覆盖这个方法。你的方法   实现应该实例化并返回自定义segue对象   执行任何必要的动画和其他步骤   展开视图控制器。