我创建了一个自定义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类,因为这个类不知道他们的孩子做了什么。
苹果论坛暂时停滞不前,现在无法获得他们的支持。如果有人有任何关于如何工作的信息,请帮助!我想缺乏这方面的文档是一个很好的指标,表明这仍然是不稳定的。
答案 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对象 执行任何必要的动画和其他步骤 展开视图控制器。