无法使用 ForEach 遍历 PHFetchResult
Not possible to loop over PHFetchResult with ForEach
我目前正在开发适用于 iOS / macOS 的照片应用程序,我正在努力使用 PhotoKit。
我确实创建了一个 class 来管理我所有的 PhotoKit 请求。
class PhotosAPI: ObservableObject {
@Published var all = PHFetchResult<PHAsset>()
@Published var allAlbums = PHFetchResult<PHAssetCollection>()
@Published var allSmartAlbums = PHFetchResult<PHAssetCollection>()
// Functions to get the Collections / Assets
}
到目前为止这部分工作正常,但现在我很难在我的视图中显示这些数据。
在我看来,我想在列表/网格中显示所有资产
struct ShowImages: View {
@ObservedObject var photos = PhotosAPI()
var body: some View {
List(photos.all, id: \.self) { item in
Text("\(item)")
}
}
}
但我确实收到错误“Initializer 'init(_:id:rowContent:)' requires that 'PHFetchResult' conform to 'RandomAccessCollection'”,我今天一整天都在尝试解决这个问题,但我没有成功我在 google.
中找不到任何有用的东西
有谁知道我如何让 PHFetchResults 遍历它们?
最后我能够用下面的代码显示图片。但这对我来说看起来是非常糟糕的代码。我宁愿直接在 PHFetchResult 上循环。有谁知道我该怎么做?
ForEach(0..<photos.all.count) { index in
Text("\(photos.all.object(at: index).localIdentifier)")
}
您可以使用enumerate
方法枚举获取的结果对象的项目,例如这个:
https://developer.apple.com/documentation/photokit/phfetchresult/1620999-enumerateobjects
您可以为 PHFetchResult
实现 RandomAccessCollection
或创建符合 RandomAccessCollection
.
的包装器
struct PHFetchResultCollection: RandomAccessCollection, Equatable {
typealias Element = PHAsset
typealias Index = Int
let fetchResult: PHFetchResult<PHAsset>
var endIndex: Int { fetchResult.count }
var startIndex: Int { 0 }
subscript(position: Int) -> PHAsset {
fetchResult.object(at: fetchResult.count - position - 1)
}
}
那么您将能够使用 PHFetchResultCollection
和 ForEach
let collection = PHFetchResultCollection(fetchResult: fetchResult)
var body: some View {
ForEach(collection, id: \.localIdentifier) {
...
}
}
我目前正在开发适用于 iOS / macOS 的照片应用程序,我正在努力使用 PhotoKit。
我确实创建了一个 class 来管理我所有的 PhotoKit 请求。
class PhotosAPI: ObservableObject {
@Published var all = PHFetchResult<PHAsset>()
@Published var allAlbums = PHFetchResult<PHAssetCollection>()
@Published var allSmartAlbums = PHFetchResult<PHAssetCollection>()
// Functions to get the Collections / Assets
}
到目前为止这部分工作正常,但现在我很难在我的视图中显示这些数据。
在我看来,我想在列表/网格中显示所有资产
struct ShowImages: View {
@ObservedObject var photos = PhotosAPI()
var body: some View {
List(photos.all, id: \.self) { item in
Text("\(item)")
}
}
}
但我确实收到错误“Initializer 'init(_:id:rowContent:)' requires that 'PHFetchResult' conform to 'RandomAccessCollection'”,我今天一整天都在尝试解决这个问题,但我没有成功我在 google.
中找不到任何有用的东西有谁知道我如何让 PHFetchResults 遍历它们?
最后我能够用下面的代码显示图片。但这对我来说看起来是非常糟糕的代码。我宁愿直接在 PHFetchResult 上循环。有谁知道我该怎么做?
ForEach(0..<photos.all.count) { index in
Text("\(photos.all.object(at: index).localIdentifier)")
}
您可以使用enumerate
方法枚举获取的结果对象的项目,例如这个:
https://developer.apple.com/documentation/photokit/phfetchresult/1620999-enumerateobjects
您可以为 PHFetchResult
实现 RandomAccessCollection
或创建符合 RandomAccessCollection
.
struct PHFetchResultCollection: RandomAccessCollection, Equatable {
typealias Element = PHAsset
typealias Index = Int
let fetchResult: PHFetchResult<PHAsset>
var endIndex: Int { fetchResult.count }
var startIndex: Int { 0 }
subscript(position: Int) -> PHAsset {
fetchResult.object(at: fetchResult.count - position - 1)
}
}
那么您将能够使用 PHFetchResultCollection
和 ForEach
let collection = PHFetchResultCollection(fetchResult: fetchResult)
var body: some View {
ForEach(collection, id: \.localIdentifier) {
...
}
}