PhotosPicker 在加载阶段冻结(SwiftUI)

问题描述 投票:0回答:1

问题是 - 我正在尝试将视频从图库加载到我的应用程序,但我无法成功。这是相关代码片段

这是我的可转移结构

struct Movie: Transferable {
    let url: URL

    static var transferRepresentation: some TransferRepresentation {
        FileRepresentation(contentType: .movie) { movie in
            SentTransferredFile(movie.url)
        } importing: { received in
            let copy = URL.documentsDirectory.appending(path: "movie.mp4")

            if FileManager.default.fileExists(atPath: copy.path()) {
                try FileManager.default.removeItem(at: copy)
            }

            try FileManager.default.copyItem(at: received.file, to: copy)
            return Self.init(url: copy)
        }
    }
}

这是我的 SwiftUI 代码

struct GalleryView: View {
    
    
    @State private var selectedItem: PhotosPickerItem?

    ....

    // Somewhere in ZStack of GalleryView
    HStack {
                
        Spacer()
                 
        VStack {
                    
            Spacer()
                    
            PhotosPicker(
               selection: $selectedItem,
               matching: .videos)
            {
                Image("btn_plus")
            }
            .padding(.bottom, 16)
                    
            }
            .padding(.trailing, 16)
      }

      ..........

      .onChange(of: selectedItem) { newValue in
            Task {
                do {
                    print("loading!!!...")
                    
                    if let movie = try await selectedItem?.loadTransferable(type: Movie.self) {
                        print("loaded!!!...")
                    } else {
                        print("failed!!!...")
                    }
                } catch {
                    print("failed with ex!!!...")
                }
            }
        }

因此,当我运行代码时,我看到我的按钮,按下它,图库会仅打开视频(如预期)。然后我选择一些视频,然后我看到了这个日志

loading!!!...

执行进入 loadTransferable 并且永远不会返回。我很确定我犯了一些新手错误,因为这是我第一次在 SwiftUI 中附加此功能。你能指出我做错了什么吗?谢谢!

ios swiftui video gallery photospicker
1个回答
0
投票

好了,现在可以了。这是为什么?不知道。我唯一的假设是我添加了 photoLibrary: .shared()),所以 PhotosPicker 代码如下所示:

PhotosPicker(
    selection: $viewModel.videoPicker.videoSelection,
    matching: .videos,
    photoLibrary: .shared())
    {
        Image("btn_plus")
    }
        .padding(.bottom, 16)

但是当我删除 photoLibrary: .shared() 只是为了确定这是否是原因时,代码也可以工作......也许第一次调用 photoLibrary: .shared() 会授予应用程序查看图库中文件的权限?我不知道...但你就知道了。我不会将这篇文章标记为我的问题的答案,因为它显然不是。

© www.soinside.com 2019 - 2024. All rights reserved.