Применение Debounce в панели поиска SwiftUIIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Применение Debounce в панели поиска SwiftUI

Сообщение Anonymous »

Я хочу применить устранение дребезга или задержку в строке поиска и предоставить пользователю несколько миллисекунд для ввода текста и выполнения фильтрации данных на основе текста поиска, введенного пользователем в панель поиска. Я попробовал приведенный ниже код в завершенном свойстве searchResults, но мне это не удалось.

Код: Выделить всё

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5)
Каков альтернативный способ добиться этого?
Вот код моей модели представления...

Код: Выделить всё

import Foundation

enum ViewState {
case loading
case error
case loaded
case emptyView
}

protocol PeopleListViewModelAction: ObservableObject {
func getPeopleList(urlStr: String) async
}

// MARK: - People List ViewModel Implementation.
@MainActor
final class PeopleListViewModel {

@Published private(set) var viewState: ViewState = .loaded
@Published  var searchText = ""
private(set)  var filteredPeople: [PeopleData] = []
private(set) var peopleLists: [PeopleData] = []
private let repository: PeopleCardsRepository

init(repository: PeopleCardsRepository) {
self.repository = repository
}
}

extension PeopleListViewModel: PeopleListViewModelAction {

func getPeopleList(urlStr: String) async {
viewState = .loaded
guard let url = URL(string: urlStr) else { return }
do {
let lists = try await repository.getPeopleList(for: url)
peopleLists = lists
viewState =  peopleLists.isEmpty ? .emptyView : .loaded
} catch {
viewState = .error
}
}
}

extension PeopleListViewModel {

var searchResults: [PeopleData] {
guard !searchText.isEmpty else { return peopleLists }
return peopleLists.filter { $0.firstName.localizedStandardContains(searchText) }
}
}
Вот мой код просмотра...

Код: Выделить всё

import SwiftUI

struct PeopleListView: View {
// MARK: - Using State Object to make sure view model object will not destroyed or recreate.
@StateObject var viewModel: PeopleListViewModel
@State private var isErrorOccured = true

var body: some View {
NavigationStack {
VStack {
switch viewModel.viewState {
case .loading:
ProgressView()
case .loaded:
showPeopleListView()
case .error:
showErrorView()
case .emptyView:
EmptyView()
}
}
.navigationTitle(Text(LocalizedStringKey("People List")))
.searchable(text: $viewModel.searchText, prompt: "Please enter name..")
}.task {
await viewModel.getPeopleList(urlStr: Endpoint.peopleListURL)
}
}

@ViewBuilder
func showPeopleListView() -> some View {
List(viewModel.searchResults) { peopleList in
NavigationLink {
PeopleDetailsView(people: peopleList)
}label: {
PeopleCellView(people: peopleList)
}
}
}

@ViewBuilder
func showErrorView() -> some View {
ProgressView().alert(isPresented: $isErrorOccured) {
Alert(title: Text("Error Occured"),message: Text("Something went wrong"),
dismissButton: .default(Text("Ok")))
}
}
}

#Preview {
PeopleListView(viewModel: PeopleListViewModel(repository: PeopleRepositoryImplementation(networkManager: NetworkManager())))
}
Вот скриншот ошибки.
[img]https://i. sstatic.net/MyrflopB.png[/img]

Вот скриншот приложения:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... search-bar
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Применение Debounce в панели поиска SwiftUI
    Anonymous » » в форуме IOS
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Swiftui Combine Debounce Textfield
    Anonymous » » в форуме IOS
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как определить Ontapgesture с Debounce в Swiftui, используя PassThroughSubject более проще, чем модификатор, модификатор
    Anonymous » » в форуме IOS
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как определить Ontapgesture с Debounce в Swiftui, используя PassThroughSubject более проще, чем модификатор, модификатор
    Anonymous » » в форуме IOS
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • React Custom Debounce Hook Cleartimeout не работает
    Anonymous » » в форуме Javascript
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous

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