如何使用协调器模式将数据发回



我想在模型视图演示器体系结构中使用Coordinator模式。我不知道如何正确地发送数据。

我有一个带有表视图和按钮的主视图控制器,当单击时,会向视图控制器显示要选择的类别。当用户选择类别时,我想取消视图控制器并使用所选类别过滤数据。

当解除视图控制器时,如何将所选类别发送到主视图控制器?

protocol MainViewProtocol: class {
func reloadTableView()
}
class MainViewController {

var presenter: MainPresenterProtocol?

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var categoryButton: UIButton!
@IBAction func selectCategory(_ sender: UIButton) {
presenter?.selectCategory()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return presenter!.currentCount
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell: ExerciseTableViewCell = tableView.dequeueResuableCell(for: indexPath)
guard let exercise = presenter?.exercises[indexPath.row] else { return UITableViewCell() }
cell.setCell(exerciseName: exercise.name)              
return cell
}
.. other table view initializing functions
}
extension MainViewController: MainViewProtocol {
func reloadTableView() {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
protocol MainPresenterProtocol: class {
var exercises: [Exercise] { get set }
func selectCategory()
func setSelectedCategory(category: String)
}
class MainPresenter: MainPresenterProtocol {
var exercises = [Exercise]() {
didSet {
view?.reloadTableView()
} 
}
weak var coordinatorDelegate: MainCoordinatorDelegate?
weak var view: MainViewProtocol?
init(view: MainViewProtocol?, coordinatorDelegate: MainCoordinatorDelegate?) {
self.view = view
self.coordinatorDelegate = coordinatorDelegate
}

func selectCategory() {
coordinatorDelegate.selectCategory()
}
func setSelectedCategory(category: String) {
// Here I filter exercises for selected category
}
... other functions
}
protocol MainCoordinatorDelegate: class {
func selectCategory()
}
class MainCoordinator: MainCoordinatorDelegate { 
...initalize functions
func start() {
//HERE I CREATE Main View Controller
let mainVC = AppStoryboard.Main.instantiate(MainViewController.self)
let presenter = MainPresenter(view: mainVC, coordinatorDelegate: self)
mainVC.presenter = presenter
navigationController.pushViewController(mainVC)
}

func selectCategory() {
let categoryVC = AppStoryboard.Main.instantiate(CategoryViewController.self)
categoryVC.coordinatorDelegate = self
navigationController.present(categoryVC)
}
func setSelectedCategory(category: String) {
navigationController.visibleViewController?.dismiss(animated: true, completion: {       
guard let vc = self.navigationController.visibleViewController as? MainViewController else { return }
vc.presenter?.setSelectedCategory(category: category) 
}
}
class CategoryViewController {

var coordinatorDelegate: MainCoordinatorDelegate?
var selectedCategory = ""
//here I have a functions for table view and set selected section value in selectedCategory
@IBAction func saveCategory(_ sender: UIButton) {
coordinatorDelegate?.setSelectedCategory(category: selectedCategory)
}
}

如何使用协调器模式将数据发回并在视图控制器中进行设置?使用导航控制器来检查什么是当前可见视图控制器,并使用它来设置数据,这是正确的方法吗?

通常的解决方案是协议和委托模式,这与Coordinator模式配合得很好。

最新更新