Unwind Segue无法在iOS 8中运行

时间:2014-09-03 23:03:52

标签: ios objective-c ios8

我有一个应用程序,在iOS 7下工作正常,但是当为iOS 8构建时,展开的segues无效。

我创建了一个新项目并添加了一个模态(带有tableviewcontroller的navigationcontroller),并尝试使用展开模式。不幸的是它也不起作用。正在展开的方法位于desination视图控制器中。展开segue是通过storyboard(tableviewcontroller中的Navigationbar按钮)创建的。当我点击按钮时,没有任何反应。没有日志输出,模态不会消失。它似乎只影响模态segue。 push / popover正常解开。

有没有人遇到类似的问题并且有一个想法我怎么能解决它?

10 个答案:

答案 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)。

默认和全屏不起作用。

enter image description here

答案 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方法。只有在

时才会发生
  • 使用modal segue
  • 演示文稿不是“当前背景”
  • 未扩展NavigationController(使用故事板中的默认设置)

也发生在IOS8 GM Seed中,因此我认为我们需要找到一种解决方法。 对我来说听起来像个小虫......

扩展UINavigationController并实现viewControllerForUnwindSegueAction没有帮助,因为它没有被触发。唯一被解雇的是扩展的UINavigationController中的canPerformUnwindSegueAction()。奇怪。

答案 5 :(得分:3)

哇哦!我仍然收到用户报告在iOS 8.1.1(在iPad 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)

要遵循的步骤:

  1. 将展开segue链接到Storyboard中的按钮。
  2. 为按钮创建IBAction并在其中添加以下代码:

    [self dismissViewControllerAnimated:NO completion:nil];
    
  3. 这适用于所有版本。