Взаимодействие между двумя разными tableView
Проблема заключается в следующем: У меня есть два разных tableView на двух разных VC: Первый - отображает список продуктов , второй - список фильтров для этих продуктов (на каждой ячейке стоит checkmark). Как только пользователь убирает чекмарк , список продуктов должен быть скрыт , и соответственно наоборот. Данные для обоих tableView берутся из сети. Не могу понять как можно сделать взаимодействие между двумя tableView
ViewController продуктов:
import UIKit
import SDWebImage
class DrinksViewController: UIViewController {
@IBOutlet var tableView: UITableView!
private var coctails = [Cocktail]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
getCoctails(with: "Beer")
}
func getCoctails(with category: String) {
Service.shared.getAllCocktails(value: "filter.php?c=" + category) { coctails in
self.coctails = coctails
self.tableView.reloadData()
}
}
}
extension DrinksViewController: UITableViewDelegate , UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//code
return coctails.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "DrinksCell") as! DrinksCell
// cell.DrinkLabel?.text = coctails[indexPath.row].name
let cocktail = coctails[indexPath.row]
cell.configureCocktail(cocktail: cocktail)
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
}
ViewController для фильтров:
import UIKit
class FiltersViewController: UIViewController {
@IBOutlet var filtersTableView: UITableView!
var filtersList = [Filter]()
override func viewDidLoad() {
super.viewDidLoad()
filtersTableView.delegate = self
filtersTableView.dataSource = self
getFilters(with: "list")
self.view.backgroundColor = UIColor.white
self.navigationItem.title = "Filters"
self.navigationController?.navigationBar.prefersLargeTitles = true
print(filtersList.count)
}
func getFilters(with category: String) {
Service.shared.getAllFilters(value: "list.php?c=" + category) { filtersList in
self.filtersList = filtersList
self.filtersTableView.reloadData()
}
}
}
extension FiltersViewController: UITableViewDelegate , UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//code
return filtersList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FiltersCell") as! FiltersCell
let filter = filtersList[indexPath.row]
cell.configureFilter(filter: filter, with: true)
cell.accessoryType = .checkmark
return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if tableView.cellForRow(at: indexPath)?.accessoryType == UITableViewCell.AccessoryType.checkmark
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.none
}
else
{
tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCell.AccessoryType.checkmark
}
}
}
Надеюсь на поддержку более опытных коллег. Заранее благодарю за помощь!
Ответы (1 шт):
Можно сделать аналог прослойки между основным и фильтрующим списками extension. В ViewController где лежит основной список делаем такую штуку:
extension YouVCName : ProdFiltering{
func applyNewFilters(filters:[String:String]?){
}
}
ProdFiltering это протокол который будет размещен в фильтрующем vc:
protocol ProdFiltering {
func applyNewFilters(filters:Dictionary<String,String>?)
}
и дальше при переходе на фильтрующий VC с основного экрана нужно передать информацию о том что мы готовы обработать фильтр на данном VC:
notesFilter.delegate = self
дальше я приведу пример того как у меня реализовано это в общем при переходе, чтобы было понятнее:
let storyboard = UIStoryboard(name: "Notepad", bundle: nil)
guard let notesFilter = storyboard.instantiateViewController(identifier: "NotesFilter") as? NotesFilter else { return}
notesFilter.filterData = self.notesFilter
notesFilter.currentFilters = self.filters
notesFilter.delegate = self
self.show(notesFilter, sender: nil)
дальше в фильтрующем VC делаем переменную:
var delegate:ProdFiltering?
и дальше при покидании VC мы вызываем эту переменную и передаем данные:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if self.isMovingFromParent {
self.delegate?.applyNewFilters(filters: currentFilters)
}
}
данные как вы понимаете можно передавать разные. При получении данных можно их применять в запросе и перезагрузить список. Так же не забудьте что нужно будет передать значения фильтров и на экран фильтров тоже чтобы видеть текущую ситуацию в списке.