Ячейка табличного представления Функция DidSelect не перемещается по правильным данным ячейкиIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Гость
 Ячейка табличного представления Функция DidSelect не перемещается по правильным данным ячейки

Сообщение Гость »


Я реализовал функцию поиска в представлении таблицы, и она работает нормально и может фильтровать данные. во время фильтрации данных ячейка табличного представления обновляется и перезагружается правильно. Когда я закончу ввод данных в панель поиска и выберу отфильтрованную ячейку, я ожидаю отобразить выбранные данные отфильтрованной ячейки в контроллере представления подробностей при вызове функции 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() } } Вот снимок экрана с данными фильтрации. Когда я выбираю первую отфильтрованную ячейку («Крестный отец»), я ожидаю отобразить сведения об этой ячейке в контроллере представления подробностей.

[
Изображение


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


Изображение

Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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