Создание списка Dynami c с заголовками разделов в SwiftUI? - PullRequest
0 голосов
/ 14 марта 2020

Я экспериментирую с 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 и т. д.

Дайте мне знать, что вы думаете, спасибо .

1 Ответ

0 голосов
/ 15 марта 2020

Для тех, кто заинтересован в решении, я придумал следующее. Я создал ViewModel для моего основного представления, чтобы манипулировать данными. В этой модели представления я извлекаю все Упражнение как массив [Exercise] из CoreData и сохраняю их в свойстве ViewModel. Затем я создал вспомогательную функцию для перебора списка [Exercise] и создания массива [ExercisesBy]. Этот тип содержит свойство, в котором хранится критерий сортировки (первая буква, группа мышц, снаряжение и т. Д. c), и другое свойство, в котором хранится массив упражнений, соответствующих этому критерию.

Этот массив ExercisesBy затем повторяется, на мой взгляд, для построения секционированного списка.

...