带有VIPER的可重用视图/模块

时间:2017-09-23 12:28:04

标签: ios swift mvvm viper-architecture

我是VIPER的新手,并尝试使用相同的方法开发模块(1个屏幕)。确切的屏幕用于应用程序的其他模块,但具有一些其他功能。只是想知道我可以在其他模块中重用哪些VIPER组件? 主持人? 路由器? 交互件? 查看?

1 个答案:

答案 0 :(得分:0)

我正在努力解决同一问题,更具体地说,我想重用VIPER的View部分。在我的应用程序中,我有ViewController(用VIPER术语表示),这对于两个模块是相同的,不同的是动作(在Presenter中)。

到目前为止,我是基于父子协议的解决方案(不确定在哪里使用VIPER最佳实践)-请在下面参考非常简化的示例

我还建议您去那里看看(毒蛇和与协议相关的类型):https://stackoverflow.com/a/30325318/5157022

这样的例子。此类拥有我想分享的常用功能

    import UIKit

    protocol CommonPresenterProtocol: class {
        func didSelect(row: Int)
    }

    protocol CommonViewProtocol: class {

    }

    class CommonView: UITableViewController {

        var presenter: CommonPresenterProtocol?

        override func numberOfSections(in tableView: UITableView) -> Int {return 1}
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return 4}
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            return tableView.dequeueReusableCell(withIdentifier: "\(indexPath.row)", for: indexPath)
        }

        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            presenter?.didSelect(row: indexPath.row)
        }

    }

    extension CommonView: CommonViewProtocol {

    }

然后是具有该功能并添加一些其他功能的类(请注意,分配“ presenter = FirstPresenter()”不应在viewDidLoad中发生-为了示例的目的只是简化)

import UIKit

protocol FirstViewProtocol: class {

}

protocol FirstPresenterProtocol: CommonPresenterProtocol { //using parent protocol
    func didDeSelect(row: Int) //adding additional functionality
}

class FirstView: CommonView {

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter = FirstPresenter()
    }

    override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
        (presenter as! FirstPresenterProtocol).didDeSelect(row: indexPath.row)
    }

}

extension FirstView: FirstViewProtocol {

}