gpt4 book ai didi

cocoa-touch - 使用自定义 View Controller 包含时无法创建展开转场

转载 作者:行者123 更新时间:2023-12-03 19:40:14 25 4
gpt4 key购买 nike

我正在尝试将我们的应用程序转换为 Storyboard,并且在处理自定义容器 Controller 时遇到了我认为是处理 unwind segues 的错误。我们有一个 View Controller ,它显示另一个并使用 View Controller 包含 api 来执行此操作,我在 IB 中连接 segue,然后为实现选择一个自定义类。 perform 方法看起来像这样:

-(void) perform {
UIViewController *container = [self sourceViewController];
UIViewController *child = [self destinationViewController];
[container addChildViewController:child];
[container.view addSubview:child.view];
child.view.center = container.view.center;
[UIView transitionWithView:container.view
duration:0.35
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
child.view.alpha = 1;
} completion:^(BOOL finished) {
[child didMoveToParentViewController:container];
}];
}

这非常有效,但是我无法让它执行回容器 Controller 的 unwind segue。我覆盖 viewControllerForUnwindSegueAction: fromViewController: withSender: 并确保它返回正确的值:
-(UIViewController *) viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
id default = [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
NSAssert1(default == self, @"Expected the default view controller to be self but was %@", default);
return default;
}

我还可以确认 canPerformUnwindSegueAction:fromViewController:withSender 正在被调用并做正确的事情,但要确保我覆盖它以返回 YES
-(BOOL) canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
return YES;
}

我希望发生的下一步是调用 segueForUnwindingToViewController:fromViewController:identifier: ,但它永远不会。相反,应用程序因 NSInternalInconsistencyException 而崩溃。
2012-10-01 10:56:33.627 UnwindSegues[12770:c07] *** Assertion failure in -[UIStoryboardUnwindSegueTemplate _perform:], /SourceCache/UIKit_Sim/UIKit-2372/UIStoryboardUnwindSegueTemplate.m:78
2012-10-01 10:56:33.628 UnwindSegues[12770:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not find a view controller to execute unwinding for <USCustomContainerViewController: 0x75949a0>'
*** First throw call stack:
(0x1c8e012 0x10cbe7e 0x1c8de78 0xb61f35 0x581711 0x45ab54 0x10df705 0x16920 0x168b8 0xd7671 0xd7bcf 0xd6d38 0x4633f 0x46552 0x243aa 0x15cf8 0x1be9df9 0x1be9ad0 0x1c03bf5 0x1c03962 0x1c34bb6 0x1c33f44 0x1c33e1b 0x1be87e3 0x1be8668 0x1365c 0x1e7d 0x1da5)
libc++abi.dylib: terminate called throwing an exception

有没有人成功地将 unwind segues 与 View Controller 包含 API 结合使用?知道我错过了什么步骤吗?我上传了 demo project to github这显示了我能想到的最简单的演示项目中的问题。

最佳答案

你的例子中的问题是那里没有。这太简单了。首先,您以一种相当奇怪的方式创建容器 View Controller (您不使用新的 IB“容器 View ”来帮助您执行此操作)。其次,你没有什么可以放松的:没有任何东西被插入或呈现在任何东西之上。

我有一个工作示例显示 canPerformUnwindSegueAction确实是在父链上进行了咨询,并且viewControllerForUnwindSegueActionsegueForUnwindingToViewController如果出现在正确的位置,则被调用且有效。看:

https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch19p640presentedViewControllerStoryboard2

我现在还在 github 上创建了您的原始示例的分支,对其进行了更正以说明这些功能:

https://github.com/mattneub/UnwindSegues

这并不是真正需要“展开”的情况,但它确实显示了在涉及自定义容器 View Controller 时如何使用“展开”。

关于cocoa-touch - 使用自定义 View Controller 包含时无法创建展开转场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12665818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com