我有一个应用程序,在iOS 7下工作正常,但是当为iOS 8构建时,展开的segues无效。
我创建了一个新项目并添加了一个模态(带有tableviewcontroller的navigationcontroller),并尝试使用展开模式。不幸的是它也不起作用。正在展开的方法位于desination视图控制器中。展开segue是通过storyboard(tableviewcontroller中的Navigationbar按钮)创建的。当我点击按钮时,没有任何反应。没有日志输出,模态不会消失。它似乎只影响模态segue。 push / popover正常解开。
有没有人遇到类似的问题并且有一个想法我怎么能解决它?
答案 0 :(得分:60)
Apple在iOS 8.1中修复了此错误
iOS 8.0的临时解决方案
展开segue仅在下一种情况下不起作用:
查看结构: UITabBarController - > UINagivationController - > UIViewController1 - >的 UIViewController2 强>
通常(在iOS 7,8.1中),当从 UIViewController2 展开到 UIViewController1 时,它会在 UIViewController1 <中调用 viewControllerForUnwindSegueAction /强>
但是在iOS 8.0和8.0.x中,它会在 UITabBarController 中调用 viewControllerForUnwindSegueAction 而不是 UIViewController1 ,这就是为什么不再展开segue的原因工作
解决方案:通过创建自定义 UITabBarController 来覆盖 UITabBarController 中的 viewControllerForUnwindSegueAction 并使用自定义。
对于Swift
CustomTabBarController.swift
import UIKit
class CustomTabBarController: UITabBarController {
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
var resultVC = self.selectedViewController?.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
return resultVC
}
}
对于旧学校Objective-C
CustomTabBarController.h
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController
@end
CustomTabBarController.m
#import "CustomTabBarController.h"
@interface CustomTabBarController ()
@end
@implementation CustomTabBarController
-(UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
return [self.selectedViewController viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
@end
=============================================== ===============================
请勿在此点之外使用任何解决方案(它们已过期且仅供参考)
9月23日的最新更新
我的新解决方案是推送嵌入导航控制器的视图,并配置导航控制器隐藏推送底栏(IB中的勾选框)。然后你会有一个看起来像模态视图的视图,唯一不同的是推动和弹出的动画。您可以根据需要进行自定义
已更新:下面的解决方案实际上显示标签栏下的模式视图,这将导致进一步的视图布局问题。
将segue类型更改为呈现为弹出仅适用于 iOS8 iPhone ,在iOS7上您的应用将崩溃< / strong>即可。
同样,为了解决这个问题,我将segue的演示文稿设置为当前上下文(我的应用程序仅适用于iphone)。
默认和全屏不起作用。
答案 1 :(得分:9)
[更新:在iOS 8.1测试版中修复了错误,但您需要支持8.0和8.0.2]
我可以通过混合Aditya和viirus的答案来解决我的问题。
我的设置进入: [查看控制器1]&gt;自定义模态segue&gt; [导航控制器]&gt; root&gt; [查看控制器2]
放卷: [视图控制器2]&gt; custom custom unwind segue&gt; [查看控制器1]
修正: 子类化[Navigation Controller],添加一个名为sourceViewController的属性,并在从[View Controller 1]到[Navigation Controller]
进行准备调用segue时将“self”传递给该属性在[Navigation Controller]子类.m覆盖/添加这两个方法:
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
if ([self.sourceViewController canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender]) {
return self.sourceViewController;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
然后我在[Navigation Controller]子类中覆盖它,因为我有一个自定义展开segue:
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [fromViewController segueForUnwindingToViewController:toViewController
fromViewController:fromViewController
identifier:identifier];
}
答案 2 :(得分:6)
这是iOS 8.0,8.0.1和8.0.2的问题。它在8.1中得到了解决; unwind segues现在正在调用适当的方法。
请注意,在iOS 8上,与iOS 7不同,在执行展开segue时,模态呈现的视图控制器可能不会被自动关闭。为确保它始终被解除,您可以检测它是否被解除,如果没有,则手动关闭它。这些不一致性在iOS 9.0中得到解决。
随着iOS 8.4在iPhone上运行,除了全屏和过度上下文之外,所有具有所有演示样式的模态呈现的段都会在放松时消失。 iPad的情况也是如此,表单和页面表的添加也不会自动消除。使用iOS 9,所有演示样式都可以在iPhone和iPad上自动关闭。
答案 3 :(得分:4)
是的,它也发生在我身上,我认为你的情况下你必须继承UINavigationController并覆盖以下内容:
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
for(UIViewController *vc in self.viewControllers){
// Always use -canPerformUnwindSegueAction:fromViewController:withSender:
// to determine if a view controller wants to handle an unwind action.
if ([vc canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender])
return vc;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
答案 4 :(得分:3)
这里的问题相同。不调用Unwind方法。只有在
时才会发生也发生在IOS8 GM Seed中,因此我认为我们需要找到一种解决方法。 对我来说听起来像个小虫......
扩展UINavigationController并实现viewControllerForUnwindSegueAction没有帮助,因为它没有被触发。唯一被解雇的是扩展的UINavigationController中的canPerformUnwindSegueAction()。奇怪。
答案 5 :(得分:3)
我从模态视图中放弃所有这些放松。只是一个很好的老式...
[self dismissViewControllerAnimated:NO completion:nil];
...适用于所有各种iOS 8.x.x版本。
答案 6 :(得分:3)
似乎iOS 7.1和iOS 8.1 / 8.2都会从导航控制器创建展开segue,但展开的segue会在导航控制器内部的子控制器上注册。
因此,从故事板中注册的控制器手动创建展开segue可以解决问题。
@implementation RootNavigationController
- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}
@end
答案 7 :(得分:1)
从目标视图控制器展开到源视图控制器时遇到了同样的问题。目的地是通过&#34; show&#34;从源头开始。 我正在使用iPhone模拟器,显示iPhone 6,iOS8.3。 XCode 6.3.2
子类化NavigationViewController的解决方案对我有用。这是快速的代码,本质上是劳尔答案的快速翻译。令我感到困惑的是,如果Apple已经在每个Raul的iOS8.1中修复了它,我怎么会在8.3中被它击中。
var sourceViewController: UIViewController?
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
if(self.sourceViewController! .canPerformUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender!)){
return self.sourceViewController
}
return super.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
}
答案 8 :(得分:0)
我刚遇到这个问题,经过一些挖掘后发现使用模态segues(至少是默认和全屏演示模式),你不能依赖正常的展开机制,而是你必须调用呈现的UIViewController的dismissViewControllerAnimated方法。
答案 9 :(得分:-2)
要遵循的步骤:
为按钮创建IBAction并在其中添加以下代码:
[self dismissViewControllerAnimated:NO completion:nil];
这适用于所有版本。