Как изменить порядок в списке SwiftUI?

#ios #swift #swiftui #swiftui-list

#iOS #swift #swiftui #swiftui-список

Вопрос:

У меня есть список объектов в списке SwiftUI, и я хочу иметь возможность фильтровать этот список на основе пользовательских данных. У меня есть список, но я не знаю, как вызвать «обновить» в представлении списка

 struct VitalsDetailView: View {
    var body: some View {
        var filteredVitals = VitalsManager.sharedInstance.vitals?.vitals?.filter({ $0.name == self.vitalName})
            
        VStack(alignment: .leading, spacing: 5) {
            VStack(alignment: .leading) {
                HStack {
                    Text(NSLocalizedString("VitalsDetails.sortedBy", tableName: nil, bundle: Bundle.main, value: "Sorted By.", comment: ""))
                        .font(.system(size: 13))
                        .fontWeight(.medium)
                    Text(NSLocalizedString("VitalsDetails.dateReported", tableName: nil, bundle: Bundle.main, value: "Date Reported.", comment: ""))
                        .font(.system(size: 13))
                        .fontWeight(.light)
                    Text(displayText)
                        .font(.system(size: 13))
                        .fontWeight(.light)
                    Image(systemName: "arrow.up.arrow.down")
                        .renderingMode(.template)
                        .foregroundColor(.blue)
                }
                .onTapGesture(count: /*@START_MENU_TOKEN@*/1/*@END_MENU_TOKEN@*/, perform: {
                    //reorder list
                    if(newToOld) {
                        filteredVitals = filteredVitals!.sorted(by: {$0.dateOfIssue!.compare($1.dateOfIssue!) == .orderedAscending })
                    } else {
                        filteredVitals = filteredVitals!.sorted(by: {$0.dateOfIssue!.compare($1.dateOfIssue!) == .orderedDescending })
                    }
                })
                Text("Last Updated Date")
                    .font(.system(size: 15))
            }
            .padding()
            
            List(filteredVitals!) { vital in
                vitalsCell(vital: vital)
            }
            
        }
        .frame(minWidth: 0,
               maxWidth: .infinity,
               minHeight: 0,
               maxHeight: .infinity,
               alignment: .topLeading)
        .background(Color((#colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1))))
        .navigationBarTitle(vitalName)
    }
}
  

Ответ №1:

Вы можете создать свое filteredVitals состояние as (или перейти в модель представления и опубликовать), т. Е.

 struct VitalsDetailView: View {
    @State private var filteredVitals = VitalsManager.sharedInstance.vitals?.vitals?.filter({ $0.name == self.vitalName})

var body: some View {
   // ... other code
  

Комментарии:

1. Отлично, спасибо!