Unwind Segue无法在iOS 8中运行

vii*_*rus 66 objective-c ios ios8

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

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

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

Ste*_*Hou 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,这就是unwind segue不再工作的原因.

解决方案:覆盖viewControllerForUnwindSegueAction的UITabBarController通过创建一个自定义的UITabBarController和使用自定义之一.

对于斯威夫特

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
    }

}
Run Code Online (Sandbox Code Playgroud)

对于老派Objective-C

CustomTabBarController.h

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

================================================== ============================

请勿使用此点以下的任何解决方案(它们已过期且仅供参考)

9月23日的最新更新

我的新解决方案是推送嵌入导航控制器的视图,并配置导航控制器隐藏推送底栏(IB中的勾选框).然后你会有一个看起来像模态视图的视图,唯一不同的是推动和弹出的动画.如果需要,您可以自定义

更新:下面的解决方案实际上显示标签栏下的模态视图,这将导致进一步的视图布局问题.

将segue类型更改为Present As Popover仅适用于iOS8 for iPhone,在iOS7上您的应用程序将崩溃.

同样,为了解决这个问题,我将segue的演示文稿设置为当前上下文(我的应用程序仅适用于iphone).

默认和全屏不起作用.

在此输入图像描述

  • 大家好.我最新最好的解决方法:回到旧的委托方法!我使用segue打开一个popover或一个模态视图,并使用标准委托方法来解除它.一切恢复正常! (2认同)

Rau*_*Rea 9

[ 更新:在iOS 8.1测试版上修复了错误但你需要它支持8.0和8.0.2]

我可以通过混合Aditya和viirus的答案来解决我的问题.

我的设置进入:[查看控制器1]>自定义模态segue> [导航控制器]>根> [查看控制器2]

展开:[查看控制器2]>自定义展开segue> [查看控制器1]

修复:对[导航控制器]进行子类化,添加一个名为sourceViewController的属性,并在从[视图控制器1]进入[导航控制器]时调用准备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];   
}
Run Code Online (Sandbox Code Playgroud)

然后我在[Navigation Controller]子类中覆盖它,因为我有一个自定义展开segue:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
   return [fromViewController segueForUnwindingToViewController:toViewController
                                          fromViewController:fromViewController
                                                  identifier:identifier];
}
Run Code Online (Sandbox Code Playgroud)


Jor*_*n H 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上自动关闭.

  • 实际上,展示segues在使用呈现样式"Current"以模态方式呈现视图控制器时工作正常.但是,只要您选择其他演示文稿样式(例如"Over Full Screen"),则展开segue不会自动关闭视图控制器.你必须在unwind segue的主体中添加dismissViewController:animated:. (2认同)