PHPickerViewController 点击搜索时出现错误...“无法加载照片”

2024-04-18

我正在尝试实现一个PHPickerViewController使用 SwiftUI 和可组合架构。 (并不是说我认为这特别相关,但它可以解释为什么我的一些代码是这样的)。

示例项目

我一直在尝试解决这个问题。我在 GitHub 上创建了一个小示例项目,它删除了可组合架构并保持 UI 超级简单。

https://github.com/oliverfoggin/BrokenImagePickers/tree/main https://github.com/oliverfoggin/BrokenImagePickers/tree/main

看起来 iOS 15 在 UIImagePickerViewController 和 PHPickerViewController 上都出现了问题。 (这是有道理的,因为它们都在后台使用相同的 UI)。

我猜接下来的步骤是确定在 UIKit 应用程序中使用它们时是否会发生相同的错误。

My code

我的代码相当简单。它几乎只是使用相同功能的重新实现UIImagePickerViewController但我想尝试使用较新的 API。

我的代码看起来像这样......

public struct ImagePicker: UIViewControllerRepresentable {

// Vars and setup stuff...
  @Environment(\.presentationMode) var presentationMode

  let viewStore: ViewStore<ImagePickerState, ImagePickerAction>
  
  public init(store: Store<ImagePickerState, ImagePickerAction>) {
    self.viewStore = ViewStore(store)
  }
  
// UIViewControllerRepresentable required functions
  public func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> some UIViewController {

    // Configuring the PHPickerViewController
    var config = PHPickerConfiguration()
    config.filter = PHPickerFilter.images
    
    let picker = PHPickerViewController(configuration: config)
    picker.delegate = context.coordinator
    return picker
  }
  
  public func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
  
  public func makeCoordinator() -> Coordinator {
    Coordinator(self)
  }
  
// This is the coordinator that acts as the delegate
  public class Coordinator: PHPickerViewControllerDelegate {
    let parent: ImagePicker
    
    init(_ parent: ImagePicker) {
      self.parent = parent
    }
    
    public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
      picker.dismiss(animated: true)
      
      guard let itemProvider = results.first?.itemProvider,
        itemProvider.canLoadObject(ofClass: UIImage.self) else {
        return
      }
      
      itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
        if let image = image as? UIImage {
          DispatchQueue.main.async {
            self?.parent.viewStore.send(.imagePicked(image: image))
          }
        }
      }
    }
  }
}

所有这些都适用于简单的情况

我可以介绍ImagePicker查看并选择一张照片,一切都很好。我可以取消它,好吧。我什至可以向下滚动我拥有的巨大图像集合视图。我什至可以看到新图像出现在我的状态对象中并将其显示在我的应用程序中。 (注意...这仍然是 WIP,所以代码有点笨拙,但这只是为了让它最初工作)。

问题案例

问题是,当我点击搜索栏时PHPickerView(这是Apple在控件中提供的搜索栏,我没有创建它或编码它)。它似乎开始向上滑动键盘,然后视图变为空白,中间有一条消息......

无法加载照片

[再试一次]

我还收到一个看起来很奇怪的错误日志。 (我删除了时间戳以缩短线路)。

// These happen on immediately presenting the ImagePicker
AppName[587:30596] [Picker] Showing picker unavailable UI (reason: still loading) with error: (null)
AppName[587:30596] Writing analzed variants.


// These happen when tapping the search bar
AppName[587:30867] [lifecycle] [u A95D90FC-C77B-43CC-8FC6-C8E7C81DD22A:m (null)] [com.apple.mobileslideshow.photospicker(1.0)] Connection to plugin interrupted while in use.
AppName[587:31002] [lifecycle] [u A95D90FC-C77B-43CC-8FC6-C8E7C81DD22A:m (null)] [com.apple.mobileslideshow.photospicker(1.0)] Connection to plugin invalidated while in use.
AppName[587:30596] [Picker] Showing picker unavailable UI (reason: crashed) with error: (null)
AppName[587:30596] viewServiceDidTerminateWithError:: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "(null)" UserInfo={Message=Service Connection Interrupted}

点击“重试”按钮会重新加载初始滚动屏幕,我可以继续使用它。但再次点击搜索栏只会显示相同的错误。

我通常是第一个指出错误几乎肯定不是由 Apple API 引起的,但我对这个问题感到困惑。我不确定我正在做的是什么导致了这种情况的发生?

它是在 SwiftUI 视图中吗?

在 UIKit 中重新创建项目

我使用 UIKit 重新制作了同一个项目......https://github.com/oliverfoggin/UIKit-Image-Pickers https://github.com/oliverfoggin/UIKit-Image-Pickers

我根本无法复制崩溃的情况。

另外...如果您对设备进行任何类型的屏幕录制,则不会发生崩溃。我尝试在设备本身上进行录音,但无法复制。我还尝试使用 iPhone 屏幕在 Mac 上录制电影,但无法重现崩溃情况。但是...当我停止 QuickTime 上的录制时,崩溃又可以重现。


This fixed对我来说.ignoreSafeArea(.keyboard)就像@Frusterated_Student 提到的那样。

为了详细说明@Frustrated_Student,这个问题与UIViewControllerRepresentable像许多 SwiftUI 视图一样对待视图以自动避开键盘。如果您像我一样使用工作表来呈现选择器,那么您只需添加.ignoreSafeArea(.keyboard) to the UIViewControllerRepresentable在我的例子中,我称之为ImagePicker这是一个更好的例子。

在哪里添加.ignoreSafeArea(.keyboard)

.sheet(isPresented: $imagePicker) {
    ImagePicker(store: store)
        .ignoresSafeArea(.keyboard)
}

这是@Fogmeister 代码:

public struct ImagePicker: UIViewControllerRepresentable {

// Vars and setup stuff...
  @Environment(\.presentationMode) var presentationMode

  let viewStore: ViewStore<ImagePickerState, ImagePickerAction>
  
  public init(store: Store<ImagePickerState, ImagePickerAction>) {
    self.viewStore = ViewStore(store)
  }
  
// UIViewControllerRepresentable required functions
  public func makeUIViewController(context: UIViewControllerRepresentableContext<ImagePicker>) -> some UIViewController {

    // Configuring the PHPickerViewController
    var config = PHPickerConfiguration()
    config.filter = PHPickerFilter.images
    
    let picker = PHPickerViewController(configuration: config)
    picker.delegate = context.coordinator
    return picker
  }
  
  public func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {}
  
  public func makeCoordinator() -> Coordinator {
    Coordinator(self)
  }
  
// This is the coordinator that acts as the delegate
  public class Coordinator: PHPickerViewControllerDelegate {
    let parent: ImagePicker
    
    init(_ parent: ImagePicker) {
      self.parent = parent
    }
    
    public func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
      picker.dismiss(animated: true)
      
      guard let itemProvider = results.first?.itemProvider,
        itemProvider.canLoadObject(ofClass: UIImage.self) else {
        return
      }
      
      itemProvider.loadObject(ofClass: UIImage.self) { [weak self] image, error in
        if let image = image as? UIImage {
          DispatchQueue.main.async {
            self?.parent.viewStore.send(.imagePicked(image: image))
          }
        }
      }
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHPickerViewController 点击搜索时出现错误...“无法加载照片” 的相关文章

  • iOS JPEG 图像旋转 90 度

    我正在使用选择器视图从相册中选择图像 我使用上面的代码 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDi
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • GoogleSignIn ios 附加到谷歌表格

    我目前正在开发一个 iOS 应用程序 该应用程序需要写入登录用户拥有的 Google 工作表 要登录我正在使用的用户GoogleSignInpod 并附加到我正在使用的谷歌表GoogleAPIClientForREST Sheets pod
  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图
  • 奇怪的父/子NSManagedObjectContext现象

    我创建了两个这样的上下文 create writer MOC privateWriterContext NSManagedObjectContext alloc initWithConcurrencyType NSPrivateQueueC
  • 在 iOS 上使用 HEVC 编码器输出视频尺寸巨大

    我有一个项目 目前使用 H 264 编码器在 iOS 上录制视频 我想尝试在 iOS 11 中使用新的 HEVC 编码器来减小文件大小 但发现使用 HEVC 编码器会导致文件大小急剧膨胀 GitHub 上的一个项目显示了该问题 它使用 H
  • NSOperation 中委托的使用

    我正在尝试利用CLLocationManager in an NSOperation 作为其中的一部分 我需要能够startUpdatingLocation然后等到收到 CLLocation 后才完成操作 目前我已经完成了以下操作 但是委托
  • 在 UITextView 上添加具有自定义间距和文本的图像

    I want to add Image on text view and want proper spacing as shown in screenshot 我尝试在文本视图上添加图像 但在根据要求放置文本时遇到问题 请向我提供有关同样的
  • iOS:将观察者添加到 UIView 的frame.origin.y?

    我正在尝试监视 UIView 框架原点的变化值并对其做出反应 我的代码 cell bottomView addObserver self forKeyPath frame origin options NSKeyValueObserving
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • ShareKit + Facebook 身份验证不起作用

    我正在使用 ShareKit 从我正在开发的 PhoneGap 应用程序发布到 Facebook 我在 Facebook 中创建了该应用程序 并在我的项目中安装了该插件 Twitter 工作正常 但当我尝试在 Facebook 上分享时出现
  • UICollectionReusableView 方法未被调用

    我希望我的部分位于UICollectionView有一个带有图像的标题 我已按照以下步骤操作 在故事板中 分配了一个标题作为我的附件UICollectionView 给它一个标识符 创建了一个子类UICollectionReusableVi
  • NSDateFormatter:根据 currentLocale 的日期,不包含年份

    这不会太难吧 我想显示不带年份的日期 例如 8 月 2 日 美国 或 02 08 德国 它也必须适用于许多其他语言环境 到目前为止 我唯一的想法是对年份进行正常格式 然后从生成的字符串中删除年份部分 我认为你需要看一下 NSString d
  • 将语音添加到自定义 UIMenuController

    我创建了一个自定义UIMenuController in a UIWebView但它似乎摆脱了 说出选择 选项UIMenuController在那之后 所有测试设备上的 偏好设置 中都打开了发言选择选项 并且它出现在其他应用程序中 包括非
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 如何从 Firebase 同步检索数据?

    我有两个集合 即用户和问题 根据使用 userId 登录的用户 我检索currQuestion价值来自users收藏 基于currQuestion值 我需要检索question来自 Firebase 的文档Questions收藏 我使用下面
  • 由于 2.23 导致 iOS 应用程序被拒绝 - iOS 数据存储指南

    以下是 Apple 关于拒绝的消息 2 23 应用程序必须遵循 iOS 数据存储指南 否则将被拒绝 2 23 详情 在启动和内容下载时 您的应用程序会存储 6 5 MB 这并不意味着 遵守 iOS 数据存储指南 下一步 请验证只有用户使用您
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al

随机推荐

  • “转到实现”以“符号没有实现”结尾

    当右键单击时 例如Visual Studio 中的方法并选择Go To Implementation它告诉我 该符号没有实现 我尝试过 services AddDbContext
  • swift 2.1 alamofire超时方法

    我对 alamofire 超时方法有疑问 首先 我的英语可能不够好 无法让你们理解我所说的 但我会厌倦解释我的问题 在我的项目中 我使用了 alamofire 出于某种原因 我需要确保我的应用程序在连接不良的区域工作 所以我正在考虑使用超时
  • Node-sass 是 React 项目的开发依赖还是生产依赖?

    在各种 React 文档中 我看到它被添加为产品依赖项 但我不明白为什么 难道它不应该是一个 devDependecy 吗 因为 SASS 只在开发过程中被编译 而当推送到 prod 时 你实际上推送的是编译后的 CSS 文件 由于需要进行
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • .NET 列表.Distinct

    我正在使用 NET 3 5 为什么我仍然收到 不包含 不同 的定义 用这个代码 using System Collections Generic code List
  • R:进入“内部”环境

    给定一个environment object e gt e
  • 使用 highcharts 将 mysql 数据库中的动态数据添加到折线图

    我想使用 ajax 或 json 将数据点添加到我的折线图中 现在我必须重新加载整个网页才能在图表上显示我的新数据 但我想通过添加如下链接的点来显示实时数据 jsfiddle net gh get jquery 1 9 1 highslid
  • 完全离线工作的领域(从不在线)

    我试图了解 mongoDB 的每个元素是如何工作的 但我真的很困惑如何处理离线 即将 https realm io https realm io 我读到了这个 Realm 移动数据库是 Core Data 和 SQLite 的开源 开发人员
  • 自动完成搜索,即使是一个字符 Android

    我在用AutoComplete小部件 它适用于两个字符搜索 但不适用于一个字符 即使用户只输入一个字符 我也想自动完成工作 例如 当我输入 1 时 它应该显示所有以 1 开头的列表 现在它显示 2 个字符的建议列表 例如 12 Code z
  • CYK算法是如何工作的?

    我必须检查一个字符串是否可以从乔姆斯基范式的给定上下文中派生出来 我正在使用 C 有非常好的伪代码 http en wikipedia org wiki CYK algorithm As pseudocode关于 CYK 算法的维基百科文章
  • 在 safari 中显示本地磁盘的图像

    我的页面中有这个标签 在 localhost 3000 上运行 img src width 400 height 200 图像确实存在 但未显示 如果我将 src 属性中的路径放入地址栏 则图像已加载 但它在 img 标记中不起作用 甚至在
  • Android Facebook 集成与无效密钥哈希

    在我的一个应用程序中 我需要从 Facebook 获取数据 我正在这样做 我创造了app ID 它登录成功 但是注销后 我登录 然后它给我 我做错了什么 我正在使用脸书软件开发工具包 我已经在手机上安装了 Facebook 它在模拟器中运行
  • 如何使用 re.sub 搜索和替换精确的字符和数字?

    我正在尝试在 python 中使用正则表达式来搜索 p1 in p1 p2 p3 p10 p11 p12 并将其替换为 hi 下面是我的Python代码 import re x p1 p2 p3 p10 p11 p12 data p1 y
  • 如何使用 MassTransit 测试工具通过构造函数依赖注入来测试 Consumer?

    我有一些消息使用者通过构造函数获取依赖项 我想在单元测试中涵盖它们 MassTransit 的测试工具是否提供了一种使用构造函数参数注册消费者的方法 创建消费者测试工具时 您可以指定工厂方法或消费者工厂 harness Consumer
  • 单击的单选按钮值显示为未定义

    对于被单击的单选按钮的值 结果显示为未定义 document ready function input radio change function checkResult this function checkResult el var c
  • 寻找 AES-CTR 加密的输入

    由于 CTR 模式下的 AES 非常适合随机访问 假设我有一个使用CipherOutputStream在 AES CTR 模式下 下面的图书馆 不是我的 使用RandomAccessFile允许查找文件中的特定字节偏移量 我最初的想法是使用
  • Spring boot:如何为静态资源添加拦截器?

    我有几个文件夹 static img 我需要向其中一些添加拦截器来检查用户权限 我之前使用过拦截器并以这种方式添加它们 SpringBootApplication EnableTransactionManagement public cla
  • 从字符串中删除所有“不可见”字符?

    我正在编写一个小类来从文件中读取键值对列表并写入Dictionary
  • RISC-V 规范引用了“hart”一词 - “hart”是什么意思?

    我找到了参考文献hart在第 35 页RISC V 2 1 规范 https content riscv org wp content uploads 2016 06 riscv spec v2 1 pdf 但是 我找不到它的定义hart在
  • PHPickerViewController 点击搜索时出现错误...“无法加载照片”

    我正在尝试实现一个PHPickerViewController使用 SwiftUI 和可组合架构 并不是说我认为这特别相关 但它可以解释为什么我的一些代码是这样的 示例项目 我一直在尝试解决这个问题 我在 GitHub 上创建了一个小示例项