适用于 iOS 8 和 iOS 9 的自定义 Unwind Segue

2024-02-08

我的问题是,如何让以下自定义展开转场在 iOS 9 之前版本的设备以及运行 iOS 9 的设备上工作?

我有一个显示视图控制器的自定义 Segue,然后有一个相应的自定义展开 Segue。这段代码在 iOS 8 中运行良好,是通过创建 UIStoryboardSegue 的子类并实现perform方法。然后我在自定义导航控制器中重写以下方法:

- (UIStoryboardSegue *) segueForUnwindingToViewController:    (UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if([fromViewController isKindOfClass:[MyViewController class]]){
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else{
        UIStoryboardSegue *unwindSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue
        segue = unwindSegue;
    }
    return segue;
}

在 iOS 9 中,segueForUnwindingToViewController已弃用。它仍然适用于 MyViewController CustomSegue;但是,默认的展开转场不再适用于任何其他展开转场。尽管调用 super 上的方法会返回展开转场,但转场永远不会发生,视图控制器永远不会弹出,并且用户永远无法返回到上一个屏幕。因此,需要明确的是,如果我使用常规的 show segue,则相应的 unwind segue 会调用已弃用的方法,该方法会调用 super 上的方法,并且不起作用。

我观看了 WWDC 关于 Storyboard 的演讲,并且我能够在 iOS 9 中解决这个问题,方法是:a) 不再在我的自定义导航控制器中重写此方法,b) 进入 Storyboard,单击自定义 Segue,然后输入CustomSegue作为 Segue 类。不幸的是,由于我的目标是 iOS 7,我收到警告“只有自定义转场支持 iOS 9 之前的类名”,并且自定义展开转场现在不适用于 iOS 7 或 iOS 8!


经过多次尝试和错误,我找到了解决方法。我注意到当你重写时segueForUnwindingToViewController, unwindForSegue:towardsViewController不再被调用,这就是问题所在。仅供参考,Apple 在 UIViewController 中的注释segueForUnwindingToViewController says:

已弃用。返回一个 Segue,它将通过以下方式从源视图控制器展开到目标视图控制器unwindForSegue:towardViewController:方法。当执行故事板中定义的展开序列时,如果展开路径上的任何视图控制器已覆盖此方法并返回非零,运行时将使用该 segue 对象,而不是构造 Interface Builder 中指定的类的实例。

粗体语句的部分似乎没有实现,即如果您重写此方法但返回 nil,unwindForSegue:towardViewController仍然没有被调用,segue 也没有发生。

为了解决这个问题,我能够编辑segueForUnwindingToViewController在我的自定义导航控制器中:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if([fromViewController isKindOfClass:[MyViewController class]]){
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else{
        if([[UIDevice currentDevice].systemVersion floatValue] < 9.0){
            return [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue
        }
        else{
            [super unwindForSegue:segue towardsViewController:toViewController];
            return nil;
        }
    }
    return segue;
}

UPDATE:呼唤[super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];似乎仍然适用于模态展开转场。我描述的问题似乎发生在演出转场中。因此,如果您的设备运行版本 [super unwindForSegue:segue towardsViewController:toViewController];当 segue 是模态的时,segue 将不会工作/发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

适用于 iOS 8 和 iOS 9 的自定义 Unwind Segue 的相关文章

随机推荐

  • 将 32 位和 64 位 DLL 合并到一个程序中

    我需要加载 dll 文件中提供的不同硬件驱动程序 问题似乎是一个设备的驱动程序是在 64 位 dll 中给出的 而另一个设备 相当旧 显然依赖于 32 位 dll 中给出的驱动程序 我想通过一个用 C 编写的程序来控制它们 该程序将通过 p
  • 如何为 Elastic Beanstalk 上的特定容器设置文件夹权限

    我在为 Elastic Beanstalk 上的 Web 文件夹设置权限时遇到问题 我在一个实例中使用自定义 docker 映像运行多个容器 apache php mysql memcached 等 对于容器 apache php 我将包含
  • 是否可以在 UIScrollView 内部放大和缩小 UIImageView,但使用自动布局保持居中?

    长话短说 我正在尝试构建类似于 Photos app 的功能 我有一个 UIScrollView 其中有一个 UIImageView 设置在 Storyboard 中 缩放可以工作 但我无法使其保持居中 在我所有基于框架的滚动视图实现中 我
  • .NET Core 捕获中间件中的 Json 反序列化错误

    我确信我错过了一些明显的东西 是否可以在 NET Core的默认中间件 反序列化器中处理JSON反序列化错误 我需要确保特定值是 JSON 原语而不是对象 数组 如果它不是原语 我想在请求到达控制器之前终止请求并返回适当的状态代码 控制器
  • Django CharField 没有空字符串

    有没有办法制作一个不接受空字符串的 CharField 或 TextField 我正在尝试使用blank False但它不工作 class Foo models Model title models CharField max length
  • iOS VoiceOver 在更改到下一个元素之前等待元素完成阅读

    我有一个按钮可以切换显示的标签 class ViewController UIViewController IBOutlet weak var label UILabel IBOutlet weak var button UIButton
  • Metal 内核在新款 MacBook Pro(2016 年末)GPU 上运行不正常

    我正在开发 macOS 项目 该项目使用 Swift 和 Metal 在 GPU 上进行图像处理 上周 我收到了新的 15 英寸 MacBook Pro 2016 年末 并注意到我的代码有一些奇怪的地方 应该写入纹理的内核似乎没有这样做 经
  • iOS 10.0 语音识别错误 kAFAssistantErrorDomain

    我尝试使用语音识别如下 let urlpath Bundle main pathForResource myvoice2 ofType m4a let url URL URL init fileURLWithPath urlpath let
  • .NET 多线程、易失性和内存模型

    假设我们有以下代码 class Program static volatile bool flag1 static volatile bool flag2 static volatile int val static void Main s
  • 关于全局/范围的 Ruby 方法查找

    我试图完全理解 Ruby 如何定位方法 符号 但当它涉及多个级别时 尤其是全局 文件范围 我感到很困难 当在类上显式调用方法时 有很多关于搜索类及其包含的模块的顺序的说明 因此确切地说是什么super每种情况下都会调用 但是当没有显式调用方
  • 如何在循环中命名和创建文件

    在 C 中 我想创建并打开文本文件以写入数据 但问题是我想即时命名文件 例如 FILE ptr for i 0 i lt 1000 i fopen s ptr i txt w operations to fill data into fil
  • JSHint 选项默认值的完整列表?

    我在哪里可以获得 JSHint 默认选项的完整列表 我尝试在网上搜索但找不到任何东西 编辑 我的意思是默认列表values for all选项 以防不清楚 你可以看看boolOptions valOptions and invertedOp
  • HQL 错误:连接所需的路径

    我一直在尝试这个查询的变体 但似乎无法实现这一点 我还参考了这篇文章 预计加入路径 休眠错误 https stackoverflow com questions 5759707 path expected for join nhiberna
  • C# 发送带有附件的电子邮件(图片)

    我的方法使用 SMTP 中继服务器发送电子邮件 一切正常 电子邮件已发送 除了附件 图像 以某种方式压缩 不存在并且无法从电子邮件中检索之外 该方法如下所示 public static bool SendEmail HttpPostedFi
  • GitHub API - 如何确定文件是否实际上是符号链接?

    通过 GitHub API 查询符号链接时 如果符号链接指向文件而不是目录 我会得到不同的结果 后者表现得更好 因为它会返回 type symlink 作为其 JSON 的一部分 而前者返回 type file 例子文件符号链接 https
  • 动态插入 3 个图像到水平滚动视图或 Viewpager

    下面显示了我正在寻找的图像 目前我正在使用视图寻呼机和圆圈指示器 在视图页面中 它仅显示单个图像 我想要在一个viewpager中显示三张图像 如图所示 当我滑动该页面时 再次从服务器加载三个不同的图像 并在下面显示文本 这个怎么做 对此有
  • 使用已知和未知字段反序列化 json

    给出以下 json 结果 默认的 json 结果有一组已知的字段 id 7908 name product name 但可以使用其他字段进行扩展 在本例中 unknown field name 1 and unknown field nam
  • jQuery - 选择具有特定样式的子项

    我不知道如何在以下示例中选择第一个跨度 div class sp span abc span span xyz span div 我尝试过使用这个 但没有成功 div sp span visibility hidden not work t
  • 使用 XCode 4.5 运行 iOS 5.1 模拟器时出现问题

    我最近将 XCode 升级到了 4 5 版本 现在当我尝试开发 iOS 5 0 5 1 的应用程序时遇到了问题 我开发了一个简单的 iPad 游戏 用户需要将图像与相应的单词进行匹配 所有这些项目都存储在 UIImageView 中 如果相
  • 适用于 iOS 8 和 iOS 9 的自定义 Unwind Segue

    我的问题是 如何让以下自定义展开转场在 iOS 9 之前版本的设备以及运行 iOS 9 的设备上工作 我有一个显示视图控制器的自定义 Segue 然后有一个相应的自定义展开 Segue 这段代码在 iOS 8 中运行良好 是通过创建 UIS