放松Segue不在iOS 8中工作
我有一个应用程序,可以在iOS 7下正常工作,但是当为iOS 8构build时,展开的segues不起作用。
我创build了一个新项目,并添加了一个模式(导航控制器与tableviewcontroller),并试图使用unwind模式。 不幸的是它也不起作用。 正在放松的方法是在desination视图控制器中。 展开的segue是通过故事板创build的(tableviewcontroller中的一个导航栏button)当我点击button时,没有任何反应。 没有日志输出,模式不会消失。 它也似乎只影响模态赛段。 推/ popover正常展开。
有没有人有类似的问题,有一个想法,我怎么能解决它?
苹果已经修复了iOS 8.1中的这个bug
适用于iOS 8.0的临时解决scheme
下一个情况下,放松继续将不起作用:
查看结构: UITabBarController – > UINagivationController – > UIViewController1 – > UIViewController2
通常(在iOS 7,8.1中),当从UIViewController2展开到UIViewController1时 ,它将在UIViewController1中调用viewControllerForUnwindSegueAction 。
然而,在iOS 8.0和8.0.x中,它将在UITabBarController而不是UIViewController1中调用viewControllerForUnwindSegueAction ,这就是为什么unwind segue不再有效。
解决方法:通过创build一个自定义的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
================================================== ============================
请勿使用本点以下的任何解决scheme(它们已过时,仅供参考)
9月23日最新更新
我的新解决scheme是推入embedded导航控制器的视图,并configuration导航控制器以隐藏底部栏(IB中的勾选框)。 那么你将有一个看起来像一个模态的看法,唯一不同的是推动和popupanimation。 你可以自定义,如果你想
更新 :下面的解决scheme实际上呈现在标签栏下的模式视图 ,这将导致进一步的视图布局问题。
将seguetypes更改为Present由于Popover将仅适用于iPhone8的iOS8 , 因此iOS7 上的应用程序将会崩溃 。
同样在这里,为了解决这个问题,我将segue的演示文稿设置为当前上下文(我的应用程序仅适用于iphone)。
默认和全屏将不起作用。
[ 更新 :在iOS 8.1testing版上修复了问题,但是您需要8.0和8.0.2的支持]
唯一能让我放松身心的工作就是把Aditya和viirus的答案混合在一起。
我的设置进入:[视图控制器1]>自定义模态segue> [导航控制器]>根> [视图控制器2]
展开:[视图控制器2]>自定义展开渐变> [视图控制器1]
修复:当从[View Controller 1]到[Navigation Controller]时,调用[Navigation Controller]子类,添加一个名为sourceViewController的属性,并在为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]; }
然后我重写了这个[导航控制器]子类只是因为我有一个自定义的unwind segue:
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { return [fromViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; }
这是iOS 8.0,8.0.1和8.0.2的问题。 在8.1中解决了; 放松赛段现在正在调用适当的方法。
请注意,在iOS 8中,与iOS 7不同的是,模式提供的视图控制器在执行展开顺序时可能不会被自动解除。为了确保它始终被解散,您可以检测它是否被解散,如果不是,则手动解除它。 这些不一致在iOS 9.0中解决。
在iPhone上运行iOS 8.4时,除了全屏和过度上下文以外,所有呈现样式的模式展示都会在展开时放弃。 iPad的情况也是如此,增加了表单和页面表单也不能自动解除。 使用iOS 9,所有演示文稿样式都会在iPhone和iPad上自动closures。
是的,它也发生在我身上,我认为你的情况下,你必须inheritanceUINavigationController并覆盖以下内容:
- (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]; }
这里同样的问题。 Unwind方法不被调用。 只有当发生
- 使用模态segue
- 演示是什么,但“当前的情况下”
- NavigationController不扩展(使用故事板中的默认设置)
也发生在IOS8 GM种子,所以我认为我们需要find一个解决方法。 听起来像一个bug给我…
扩展UINavigationController并实现viewControllerForUnwindSegueAction没有帮助,因为它没有被解雇。 唯一被触发的是扩展的UINavigationController中的canPerformUnwindSegueAction()。 奇怪。
哇! 我仍然得到在iOS 8.1.1(在iPad 3上)模式视图卡住的用户报告。
我抛弃所有这些从模态的angular度放松。 只是一个很好的老式…
[self dismissViewControllerAnimated:NO completion:nil];
…在各种iOS 8.xx版本上工作正常。
似乎iOS 7.1和iOS 8.1 / 8.2都会导航到导航控制器,但是在导航控制器内部的子控制器上注册了解除静音。
所以,从故事板中注册的控制器手动创build一个展开顺序解决了问题。
@implementation RootNavigationController - (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; } @end
从目标视图控制器展开到源视图控制器时遇到同样的问题。 目的地是通过从源头上的“show”来呈现的。 我使用iPhone模拟器,显示iPhone 6,iOS8.3。 XCode 6.3.2
NavigationViewController子类的解决scheme为我工作。 这里是迅速的代码,这是劳尔的答案的快速翻译。 我感到困惑的是,如果苹果已经在每劳尔的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) }
我只是遇到了这个问题,经过一些挖掘发现,与模式segues(至less有默认和全屏演示模式),你不能依靠正常的展开机制,而是你必须调用呈现的UIViewController的dismissViewControllerAnimated方法。
应遵循的步骤:
- 将展开的渐变链接到Storyboard中的button。
-
为button创buildIBAction,并在其中添加下面的代码:
[self dismissViewControllerAnimated:NO completion:nil];
这应该适用于所有版本。