Я реализовал функцию поиска в представлении таблицы, и она работает нормально и может фильтровать данные. во время фильтрации данных ячейка табличного представления обновляется и перезагружается правильно. Когда я закончу ввод данных в панель поиска и выберу отфильтрованную ячейку, я ожидаю отобразить выбранные данные отфильтрованной ячейки в контроллере представления подробностей при вызове функции DidSelectRowAt. Но он не показывает данные из отфильтрованной ячейки, а показывает другие данные ячейки.
Вот код моей модели представления, в которой есть функция поиска.
// ОТМЕТКА: - Функция поиска. перечисление MoviesViewModelState { загрузка ящика дело загружено([Фильм]) ошибка регистра вар фильмы: [Фильм] { переключить себя { чехол .loaded(пусть фильмы): вернуть фильмы случай .загрузка, .ошибка: возвращаться [] } } } /// Вызов API для получения данных о фильме. здесь последний класс MoviesViewModel { /// Здесь происходит вызов API. } расширение MoviesViewModel { общественная функция inSearchMode (_ searchController: UISearchController) -> Bool { пусть isActive = searchController.isActive пусть searchText = searchController.searchBar.text ?? "" вернуть isActive && !searchText.isEmpty } общественная функция updateSearchController (searchBarText: String?) { self.filteredMovie = state.movies если let searchText = searchBarText?.lowercased() { Guard !searchText.isEmpty еще {возврат } self.filteredMovie = self.filteredMovie.filter({ $0.title.lowercased().contains(searchText) }) } } } Вот код контроллера табличного представления..
окончательный класс MoviesViewController: UITableViewController { частная модель просмотра: MoviesViewModel // ОТМЕТКА: - Компоненты пользовательского интерфейса частный пусть searchController = UISearchController (searchResultsController: ноль) init (viewModel: MoviesViewModel) { self.viewModel = модель просмотра super.init(nibName: ноль, пакет: ноль) } требуется инициализация?(кодер: NSCoder) { FatalError("init(coder:) не реализован") } переопределить функцию viewDidLoad() { супер.viewDidLoad() title = LocalizedString(ключ: "movies.title") настройкаSearchController() настроитьТаблевиев() обновлениефромвиевмодель() привязкаViewModel() viewModel.fetchData() } частная функция configureTableView() { tableView.dm_registerClassWithDefaultIdentifier(cellClass: MovieCell.self) tableView.rowHeight = UITableView.automaticDimension обновитьКонтроль = UIRfreshControl() обновитьControl?.addTarget(self, действие: #selector(refreshData), для: .valueChanged) } частная функция bindViewModel() { viewModel.updatedState = { [слабое Я] в охранник пусть себя еще {вернуться} DispatchQueue.main.async { self.updateFromViewModel() } } } частная функция updateFromViewModel() { переключить viewModel.state { случай .loading, .loaded: tableView.reloadData() случай .ошибка: показатьОшибку() } обновитьКонтроль?.endRefreshing() } // ОТМЕТКА: свойство setUpSearch. частная функция setupSearchController() { self.searchController.searchResultsUpdater = сам self.searchController.obscuresBackgroundDuringPresentation = false self.searchController.hidesNavigationBarDuringPresentation = false self.searchController.searchBar.placeholder = "Поиск фильма" self.navigationItem.searchController = searchController self.definesPresentationContext = ложь self.navigationItem.hidesSearchBarWhenScrolling = false searchController.delegate = сам searchController.searchBar.delegate = сам searchController.searchBar.showsBookmarkButton = true searchController.searchBar.tintColor = .фиолетовый searchController.searchBar.setImage(UIImage(named: «Filter»), для: .bookmark, состояние: .normal) searchController.searchBar.setLeftImage(UIImage(named: «Search»)) searchController.searchBar.showsBookmarkButton = true } @objc Private Func RefreshData() { viewModel.fetchData() } @objc Private func textSizeChanged() { tableView.reloadData() } } // ОТМЕТКА: - UITableViewDataSource расширение MoviesViewController { переопределить func tableView (_ tableView: UITableView, раздел NumberOfRowsInSection: Int) -> Int { пусть inSearchMode = self.viewModel.inSearchMode(searchController) вернуться в режим поиска? self.viewModel.filteredMovie.count: self.viewModel.state.movies.count } переопределить функцию tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { пусть ячейка: MovieCell = tableView.dm_dequeueReusableCellWithDefaultIdentifier() пусть inSearchMode = self.viewModel.inSearchMode(searchController) пусть фильм = inSearchMode? self.viewModel.filteredMovie[indexPath.row] : self.viewModel.state.movies[indexPath.row] ячейка.configure(фильм) возвратная ячейка } } // ОТМЕТКА: - UITableViewControllerDelegate расширение MoviesViewController { переопределить func tableView (_ tableView: UITableView, DidSelectRowAt indexPath: IndexPath) { пусть фильм = viewModel.state.movies[indexPath.row] пусть viewModel = MoviesDetailsViewModel (фильм: фильм, apiManager: APIManager()) пусть viewController = MovieDetailsViewController (viewModel: viewModel) self.navigationController?.pushViewController(viewController, анимированный: true) } } // ОТМЕТКА: - Функции контроллера поиска расширение MoviesViewController: UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate { func updateSearchResults (для searchController: UISearchController) { self.viewModel.updateSearchController(searchBarText: searchController.searchBar.text) tableView.reloadData() } } Вот снимок экрана с данными фильтрации. Когда я выбираю первую отфильтрованную ячейку («Крестный отец»), я ожидаю отобразить сведения об этой ячейке в контроллере представления подробностей.
[

Но вот результат, когда я выбираю отфильтрованную ячейку, и она показывает неправильные данные в контроллере представления подробностей.
