Как обновить отфильтрованный список в SwiftUI, когда значение в фильтре изменено?IOS

Программируем под IOS
Ответить
Anonymous
 Как обновить отфильтрованный список в SwiftUI, когда значение в фильтре изменено?

Сообщение Anonymous »

Обычное предостережение для новичков в SwiftUI и извинения: это простой вопрос.
У меня есть представление, в котором есть средство выбора даты, а также две стрелки для увеличения/уменьшения дня. Когда эта дата обновляется, я пытаюсь отфильтровать список «сеансов» из базы данных, которые соответствуют отображаемой в данный момент дате.
У меня есть переменная filteredSessions, которая применяет фильтр ко всем «сеансам» из базы данных. Однако, похоже, этот фильтр не обновляется каждый раз при изменении даты.
У меня есть дата, которая будет использоваться, и хранится как объект «@State» в представлении. Я думал, что это приведет к обновлению представления при каждом изменении этого поля? Однако я запустил отладчик и обнаружил, что переменная filteredSessions вызывается только один раз, а не при изменении даты (либо с помощью средства выбора, либо с помощью кнопок).
Есть ли что-то, что мне здесь не хватает? Нужен ли мне специальный способ «привязать» это значение даты к списку, поскольку оно не используется напрямую при отображении?
Код ниже. Спасибо
import SwiftUI

struct TrainingSessionListView: View {

@StateObject var viewModel = TrainingSessionsViewModel()
@State private var displayDate: Date = Date.now
@State private var presentAddSessionSheet = false

private var dateManager = DateManager()

private let oneDay : Double = 86400

private var addButton : some View {
Button(action: { self.presentAddSessionSheet.toggle() }) {
Image(systemName: "plus")
}
}

private var decreaseDayButton : some View {
Button(action: { self.decreaseDay() }) {
Image(systemName: "chevron.left")
}
}

private var increaseDayButton : some View {
Button(action: { self.increaseDay() }) {
Image(systemName: "chevron.right")
}
}

private func sessionListItem(session: TrainingSession) -> some View {
NavigationLink(destination: TrainingSessionDetailView(session: session)) {
VStack(alignment: .leading) {
Text(session.title)
.bold()
Text("\(session.startTime) - \(session.endTime)")
}
}
}

private func increaseDay() {
self.displayDate.addTimeInterval(oneDay)
}

private func decreaseDay() {
self.displayDate.addTimeInterval(-oneDay)
}

var body: some View {
NavigationView {
VStack {
HStack {
Spacer()
decreaseDayButton
Spacer()
DatePicker("", selection: $displayDate, displayedComponents: .date)
.labelsHidden()
Spacer()
increaseDayButton
Spacer()
}
.padding(EdgeInsets(top: 25, leading: 0, bottom: 0, trailing: 0))

Spacer()

ForEach(filteredSessions) { session in
sessionListItem(session: session)
}

Spacer()

}
.navigationTitle("Training Sessions")
.navigationBarTitleDisplayMode(.inline)
.navigationBarItems(trailing: addButton)
.sheet(isPresented: $presentAddSessionSheet) {
TrainingSessionEditView()
}

}
}

var filteredSessions : [TrainingSession] {
print("filteredSessions called")
return viewModel.sessions.filter { $0.date == dateManager.dateToStr(date: displayDate) }
}
}

struct TrainingSessionListView_Previews: PreviewProvider {
static var previews: some View {
TrainingSessionListView()
}
}


Подробнее здесь: https://stackoverflow.com/questions/753 ... is-changed
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»