iOS 13 的presentationControllerDidDismiss() 在紧凑环境中未调用 Popover

2024-01-07

我正在为 iOS 13 的新“卡片式”模式视图更新我的应用程序。一切都运行良好,使用UIAdaptivePresentationControllerDelegate’s presentationControllerDidAttemptToDismiss() and presentationControllerDidDismiss()功能。但是,对于有自己观点的人来说.modalPresentationStyle set to .popover, presentationControllerDidDismiss()当在紧凑的环境中呈现时(例如分体或滑盖的手机或 iPad),不会调用。当在常规尺寸类环境(例如 iPad 全屏)中呈现时,它可以正确调用。

我的代码设置非常简单:

显示弹出窗口的代码:

func showChooser() {
    // other setup code...
    navController.modalPresentationStyle = .popover
    navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
    self.present(navController, animated: true)
}

然后,所提出的控制器符合UIAdaptivePresentationControllerDelegate并设置:

// This is in the presented view controller (i.e. the popover)
override func viewDidLoad() {
    // other setup removed for brevity…
    self.navigationController?.presentationController?.delegate = self
}

func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
    print("did dismiss")
    self.cancel?()
}

当视图在常规大小级别环境中呈现时,它会正确显示为弹出窗口。当用户点击弹出框外部时,presentationControllerDidDismiss()叫做。然而,当相同的代码在紧凑的环境中呈现时,它会正确显示(作为卡片样式),但是当用户向下拖动视图时,presentationControllerDidDismiss()不被调用。

如果我改变.modalPresentationStyle到其他东西,例如.pageSheet or .formSheet,那么无论是紧凑演示还是常规演示,一切都会按预期进行。

我尝试过使用代表的adaptivePresentationStyle()将样式更改为.formSheet在紧凑的环境中,但是presentationControllerDidDismiss()仍然没有正确调用。

Update: 我应该提到我当前的解决方法是检查尺码类别并更改.modalPresentationStyle如所须:

if self.traitCollection.horizontalSizeClass == .compact {
    navController.modalPresentationStyle = .automatic
} else {
    navController.modalPresentationStyle = .popover
    navController.popoverPresentationController?.barButtonItem = self.viewController?.navigationItem.leftBarButtonItem
}

这可行,但似乎只使用.popover样式应该正确适应并调用正确的委托方法。

更新2:我更新了上面的代码以澄清呈现视图控制器是处理委托方法的控制器。

另外,在深入研究之后,我注意到如果呈现视图控制器是委托并处理委托方法,然后这一切都按预期工作。由于它也适用于呈现所有人的视图控制器.modalPresentationStyle's except在紧凑环境中的弹出窗口中,当弹出窗口以这种方式呈现时,也许存在一些生命周期问题?

关于我可能做错了什么有什么想法吗?


问题只是时间问题之一。您在第二个视图控制器中执行此操作:

override func viewDidLoad() {
    self.navigationController?.presentationController?.delegate = self
}

这也太late。您可以设置您配置和执行演示的代理:

func showChooser() {
    navController.modalPresentationStyle = .popover
    navController.popoverPresentationController?.barButtonItem = 
        self.viewController?.navigationItem.leftBarButtonItem
    navController.presentationController?.delegate = // *
        navController.viewControllers[0] 
        as! UIAdaptivePresentationControllerDelegate
    self.present(navController, animated: true)
}

如果您希望坚持让第二个视图控制器将自身设置为委托,请尽早执行。第一个好机会是willMove:

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

iOS 13 的presentationControllerDidDismiss() 在紧凑环境中未调用 Popover 的相关文章

  • 将 IOS 中的应用程序功能限制为仅适用于 Cell/WiFi 数据。

    我已经在 StackOverFlow 上进行了搜索 但没有找到任何关于如何使用所需设备功能或UIRequiresPersistentWiFi 如何在我的应用程序中设置值 以便该应用程序仅适用于 iPhone 中的蜂窝数据 WiFi 目前 我
  • iOS 键盘颜色变化 - 键盘外观深色不粘

    在我们的应用程序中 我们将键盘外观设置为深色 正如预期的那样 这会产生一个黑色键盘 但是 如果显示键盘 并且我们按主页按钮 然后返回应用程序 键盘会变成白色 如图所示 有什么想法吗 这可能与键盘是全局对象这一事实有关 在任何给定时间 内存中
  • 在 iOS 视图中获取触摸位置时,PAN 手势崩溃

    我只是做了一个示例来检查平移手势 平移手势正在检测并且工作正常 但每当我在平移手势中给出第二个点时 例如CGPoint secondPoint sender locationOfTouch 1 inView self imageView 它
  • Swift 中的 NSManagedObject 描述

    发生了一些奇怪的事情NSManagedObject description 它只打印一个空行 import Foundation import CoreData objc MyEntity class MyEntity NSManagedO
  • iOS CoreData:“数据模型版本编译器”错误

    我在项目中创建了一个数据模型文件 ChatModel xcdatamodeld 然后我合并了github上的分支 project pbxproj 中存在冲突 我修好了它们 然后错误就发生了 Users mac zhongqing ios Z
  • Swift 3 类型推理混乱

    我正在使用 macOS 我有以下代码 1 2 3 4 和 5 之间的唯一区别在于 metrics 参数的内容 let a 20 let met a a 1 This compiles NSLayoutConstraint constrain
  • 选择 MapView 注释两次

    我的 iPhone 应用程序有一个地图视图 其中有大量位置可供用户选择 我希望他能够点击其中一个注释来显示其标注视图 然后再次实际选择它 问题是 didSelectAnnotationView 只被调用一次 那么如何检测已选择的注释的选择呢
  • 使用 DatePicker 展开和折叠 UITableViewCells

    我正在构建一个应用程序 让用户从 UITableView 中选择日期 tableView 是静态且分组的 我浏览了很多问题 包括this one https stackoverflow com questions 18973573 ios
  • iOS7 后台同步

    我们必须开发一个应用程序 无论该应用程序是在前台还是在后台 都支持在某个时间间隔进行数据同步操作 我想知道在iOS7中 当应用程序在后台运行时 是否可以同步数据 即调用网络服务 我们可以在应用程序处于后台时访问 SQLite 数据库文件 我
  • Xcode:libpods.a 为红色

    有人知道为什么吗 我正在使用 SWRevealViewController 到目前为止它一直在工作 我正在使用工作区 并且我已经研究过其他文章 但到目前为止没有任何效果 它不会引发错误 但是当我运行程序时 它不会加载任何内容 因为 SWRe
  • Swift 错误中的 UIColor 扩展

    我有这个扩展 extension UIColor func rgba r Int g Int b Int a Float gt UIColor return UIColor red r 255 green g 255 blue b 255
  • Swift 4 的observeValue(forKeyPath:...)方法

    我一直在尝试寻找一个例子 但我所看到的并不适合我的情况 以下代码等效于什么 object addObserver self forKeyPath keyPath options new context nil override public
  • 无法在 Crashlytics/fabric 中获取崩溃报告。显示错误:“看起来我们缺少 dSYM 来处理以下版本的崩溃。”

    我的 iOS 应用程序的 Fabric crashlytics 中未生成崩溃报告 Fabric 仪表板上显示错误 如屏幕截图所示 按照fabric的指示 我尝试从安装fabric mac应用程序的机器 我创建应用程序的版本 中搜索聚光灯下给
  • React Native 中的发布模式诊断

    有没有办法让React Native输出所有console log呼叫同一个地方NSLog goes 有没有办法让我看到输出console log在发布模式下 如果没有 是否有一个 NSLog helper for React Native
  • Swift - 带有两行文本的 UIButton

    我想知道是否可以创建一个包含两行文本的 UIButton 我需要每一行都有不同的字体大小 第一行为 17 点 第二行为 11 点 我尝试过将两个标签放在 UIButton 内 但我无法让它们留在按钮的范围内 我试图在 ui 构建器中完成所有
  • 如何在 Objective-C 中运行时查找字符串常量?

    我的公司开发了一个广告 SDK 可以协调其他广告网络 在运行时 它通过使用检查其他广告网络是否存在NSClassFromString 并发送这些类消息 如果存在 这对于 Objective C 对象来说效果很好 但是如何在运行时加载字符串常
  • iOS:将 ISO Alpha 2 转换为 Alpha 3 国家/地区代码

    是否可以在 iOS 中将 ISO 3166 alpha 2 国家 地区代码转换为 alpha 3 国家 地区代码 例如 DE 转换为 DEU 基于 Franck 的答案 这里是用于加载 plist 的代码 swift4 然后转换 3 个字母
  • 应用内购买“无法连接到 iTunes Store”

    我在测试应用内购买时遇到问题 我取回了有效的产品标识符 但在购买后我收到了可怕的 无法连接到 iTunes Store 有趣的是 恢复购买似乎有效 会弹出 iTunes 登录 我有 检查我的应用内购买是否已批准出售 检查 重新检查我的源代码
  • 如何使我的响应式网站在手机上支持“请求桌面网站”?

    我有一个响应灵敏的动态网站 Java Servlet 驱动且完全手工编码 由于它是一个返回数据表的科学站点 因此某些选项在较小的视口宽度下不可用 然而 可能有些用户更喜欢在桌面网站上挣扎才能访问这些选项 我希望适应他们 我的问题是 对于 i
  • 使 Picker 与其他 BinaryInteger 类型兼容

    Picker仅当与以下一起使用时才能正常工作Int 当使用任何其他类型的BinaryInteger它根本不更新选择 为了解决这个问题 我想做一个CompatilibityPicker但我必须承认我的理解Binding实际上工作给我带来了很多

随机推荐