Я экспериментирую с SwiftUI и пытаюсь создать приложение для отслеживания тренировок, которое я уже набросал в UIKit. Я пытаюсь создать список упражнений, чтобы пользователь мог с ним ознакомиться, поэтому при запуске приложения я загружаю некоторые упражнения в CoreData, и упражнение имеет следующие свойства.
@NSManaged public var name: String
@NSManaged public var muscleGroup: String
@NSManaged public var exerciseDescription: String
@NSManaged public var type: String
@NSManaged public var id: UUID
Когда я строю список вид, я извлекаю массив упражнений из CoreData и загружаю их в список. Это прекрасно работает со списком basi c, я хотел бы создать список с заголовками разделов в алфавитном порядке. В UIKit я сделал это, построив словарь в форме ["Префикс": [Упражнение]] и используя ключи в качестве заголовков разделов. Это практично, потому что я мог бы предоставить пользователю возможность сортировки, просто изменив словарь и перезагрузив данные. В SwiftUI я не могу заставить его работать, потому что я не могу работать с объектом запроса выборки перед созданием представления, и я не могу перебирать словари. Вот мой код:
import SwiftUI
import CoreData
struct ExerciseListUIView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
entity: Exercise.entity(),
sortDescriptors: [
NSSortDescriptor(keyPath: \Exercise.name, ascending: true)
]
) var exerciseList: FetchedResults<Exercise>
@State private var prefixList = [String]()
var body: some View {
return NavigationView {
VStack{
List(exerciseList, id: \.self) { exercise in
Text(exercise.name)
}
}
.navigationBarTitle("Exercises")
}
}
}
Я перепробовал кучу вещей, но ничего не помогло. Наиболее многообещающее решение, кажется, хранит упражнения непосредственно в другой структуре данных, ExercisesByLetter (префикс: «String», упражнения: [Exercise]), извлекает массив [ExercisesByLetter] и повторяет его для построения списка, но это будет означать изменив способ хранения данных, добавив больше работы в функции хранения данных и заставив добавлять разные хранилища для каждой опции сортировки, например, ExercisesByMuscleGroup, ExercisesByEquipment и т. д.
Дайте мне знать, что вы думаете, спасибо .