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).
默认和全屏不起作用.

[ 更新:在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)
这是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上自动关闭.
| 归档时间: |
|
| 查看次数: |
29676 次 |
| 最近记录: |