#core-data #swiftui
Вопрос:
У меня есть таблица, содержащая 20 песен от 5 разных исполнителей , это число может увеличиваться и уменьшаться, теперь мне нужно представление, в котором я могу отображать навигацию по этим уникальным певцам с их изображениями, которые также находятся в таблице.
Поэтому мне нужны только отдельные записи, основанные на имени исполнителя , я запрашиваю coredata, но когда я использую его в представлении, я получаю Generic struct 'ForEach' requires that 'NSFetchRequest<NSDictionary>' conform to 'RandomAccessCollection'
Теперь, чтобы преодолеть это, я использую id:.self, это тоже не работает.
Теперь я читаю и узнаю , что ForEach не любит любой ТИП, который не отсортирован, но я не смог найти способ обойти это, может ли кто-нибудь любезно предложить какие-либо решения, спасибо.
Вот как я извлекаю уникальные записи из основных данных
let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
init(songLVM: Binding<SongListVM>){
_songLVM = songLVM
fetchRequest.propertiesToFetch = ["artistname"]
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = .dictionaryResultType
}
Ниже приведен весь файл целиком
import Foundation
import SwiftUI
import CoreData
struct ArtistList: View {
@Environment(.managedObjectContext) var managedObjectContext
@Binding var songLVM: SongListVM
@State var namesFilter = [String]()
//-----
let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
init(songLVM: Binding<SongListVM>){
_songLVM = songLVM
fetchRequest.propertiesToFetch = ["artistname"]
fetchRequest.returnsDistinctResults = true
fetchRequest.resultType = .dictionaryResultType
}
//-----
var body: some View {
List {
ForEach(fetchRequest) { <---- Error here
idx in
NavigationLink(
destination: ArtistSongs(artistName: idx.artistname ?? "no name", songLVM: $songLVM)) {
ZStack(alignment: .bottomTrailing) {
Image(uiImage: UIImage(data: idx.artistImage ?? Data()) ?? UIImage())
.resizable()
.frame(width: 350, height: 350, alignment: .center)
Text(idx.artistname ?? "no name")
.font(Font.system(size: 50, design: .rounded))
.foregroundColor(.white)
}
}
}
}
}
}
Комментарии:
1. Разве вы не хотите выполнить
forEach
«результат» выборки вместо «команды выборки»?2. @Larme , спасибо , вы хотите, чтобы я перенес артистов 1 в какую-нибудь другую переменную, а затем сделал для каждого элемента в демо, как цикл?
Ответ №1:
как только вы выясните, что такое ваш словарь, попробуйте сделать это в своем ForEach
цикле:
ForEach(dict.sorted(by: >), id: .key) { key, value in
...
}
ПРАВКА1:
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: Artists.artistname, ascending: true)],
animation: .default)
private var artists: FetchedResults<Artists>
...
ForEach(artists, id: .self) { artist in
...
}
Комментарии:
1. Я , должно быть, делаю что — то не так, но в моем коде , когда я это делаю-ForEach(fetchRequest.сортированный(по:>), идентификатор: .ключ) { ключ, значение в, я получаю множество ошибок, таких как Ссылка инициализатора ‘init(_:идентификатор:содержимое:)’ на ‘ForEach’ требует, чтобы ‘Ссылка навигации><ZStack<_>, песни исполнителей<_>>’ соответствовали ‘TableRowContent’, Значение типа ‘NSFetchRequest<_>><NSDictionary>’ не имеет члена «сортировка» и т. Д., Это значит, что запрос coredata неверен ?
2. обновил свой ответ с возможным подходом.
3. Извините, что я решил эту проблему сейчас, большое спасибо, это помогает мне лучше понимать коллекции