问题是 - 我正在尝试将视频从图库加载到我的应用程序,但我无法成功。这是相关代码片段
这是我的可转移结构
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 中附加此功能。你能指出我做错了什么吗?谢谢!
好了,现在可以了。这是为什么?不知道。我唯一的假设是我添加了 photoLibrary: .shared()),所以 PhotosPicker 代码如下所示:
PhotosPicker(
selection: $viewModel.videoPicker.videoSelection,
matching: .videos,
photoLibrary: .shared())
{
Image("btn_plus")
}
.padding(.bottom, 16)
但是当我删除 photoLibrary: .shared() 只是为了确定这是否是原因时,代码也可以工作......也许第一次调用 photoLibrary: .shared() 会授予应用程序查看图库中文件的权限?我不知道...但你就知道了。我不会将这篇文章标记为我的问题的答案,因为它显然不是。