Обычное предостережение для новичков в 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
Как обновить отфильтрованный список в SwiftUI, когда значение в фильтре изменено? ⇐ IOS
Программируем под IOS
1762546735
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()
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/75324913/how-to-update-filtered-list-in-swiftui-when-the-value-in-the-filter-is-changed[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия