如何将演示者作为依赖项注入到CustomTableViewCell

时间:2019-07-09 03:23:15

标签: swift

我正在学习依赖注入,并通过MVP创建了一个应用。

我可以使用情节提要为AppDelegate中的一些VC注入演示者。

但是现在我用CustomTableViewCell创建了.xib,该UIButton的单元格上有UINib(nibName~,所以我想在presenter文件中处理它的详细信息。

我试图在AppDelegate中创建CustomTableViewCell,但是当调用nil中的主持人时,它是presenter

我听说将处理一个在“ AppDelegate”中调用的单元格实例。但是我不知道有没有办法使class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let mainTabVC = UIStoryboard(name: "MainTab", bundle: nil).instantiateInitialViewController() as! MainTabViewController let userDefault = UserDefault() let presenter = MainTabPresenter(view: mainTabVC, udManager: userDefault) mainTabVC.inject(presenter: presenter, userDefaultManager: userDefault) let addTabVC = UIStoryboard(name: "AddTab", bundle: nil).instantiateInitialViewController() as! AddTabViewController let alertHandller = AlertHandller() let addPresenter = AddTabPresenter(view: addTabVC, mainView: mainTabVC, alertHandller: alertHandller) addTabVC.inject(presenter: addPresenter) let settingTabVC = UIStoryboard(name: "SettingTab", bundle: nil).instantiateInitialViewController() as! SettingTabViewController let settingPresenter = SettingTabPresenter(view: settingTabVC) settingTabVC.inject(presenter: settingPresenter, alertHandller: alertHandller) let vcs = [mainTabVC, addTabVC, settingTabVC] let mainTabBar = UIStoryboard(name: "MainView", bundle: nil).instantiateInitialViewController() as! MainTabBarController mainTabBar.setViewControllers(vcs, animated: false) // no probs until here (inject functions work) // this is disposed?? let listCell = UINib(nibName: "ListCell", bundle: nil).instantiate(withOwner: ListCell.self, options: nil).first as! ListCell let cellPresenter = ListCellPresenter(view: mainTabVC) listCell.inject(presenter: cellPresenter) window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = mainTabBar window?.makeKeyAndVisible() return true } 为零。

AppDelegate

class MainTabViewController: UIViewController {

    private let shared = Sharing.shared

    private var presenter: MainTabPresenterInput!
    private var userDefaultManager: UserDefaultManager!
    func inject(presenter: MainTabPresenterInput, userDefaultManager: UserDefaultManager) {
        self.presenter = presenter
        self.userDefaultManager = userDefaultManager
    }

override func viewDidLoad() {
        super.viewDidLoad()
        tableViewSetup()

    }

    func tableViewSetup(){
        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UINib(nibName: "ListCell", bundle: nil), forCellReuseIdentifier: "ListCell")
    }
}

extension MainTabViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return shared.items.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
        if let item = presenter.item(row: indexPath.row) {
            cell.configure(item: item)
        }
        return cell
    }
}


tableViewDataSource编写的VC

class ListCell: UITableViewCell {

    private let shared = Sharing.shared
    private var presenter: ListCellPresenterInput!

    func inject(presenter: ListCellPresenterInput) {
        self.presenter = presenter
    }

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    @IBAction func favButtonTapped(_ sender: Any) {
        let row = self.tag
        switch shared.items[row].fav {
        case true:
            favButton.setImage(UIImage(named: "favIconNon"), for: .normal)
        case false:
            favButton.setImage(UIImage(named: "favIcon"), for: .normal)
        }
        presenter.countFavIcon(rowAt: row) // this presenter is nil
    }

    func configure(item: Item) {
    ・・・
    }
}

customTableViewCell

protocol AddTabPresenterInput {
    func addButtonTapped(item item: Item?)
}

protocol AddTabPresenterOutput: AnyObject {
    func clearFields()
    func showAlert(alert: UIAlertController)
}

final class AddTabPresenter: AddTabPresenterInput {

    private weak var view: AddTabPresenterOutput!
    private weak var mainView: MainTabPresenterOutput!
    private weak var alertHandller: AlertHandllerProtocol!

    let shared = Sharing.shared

    init(view: AddTabPresenterOutput, mainView: MainTabPresenterOutput, alertHandller: AlertHandllerProtocol) {
        self.view = view
        self.mainView = mainView
        self.alertHandller = alertHandller
    }

    func addButtonTapped(item item: Item?) {
        print("called")
        mainView.updateView()
    }
}

单元格主持人

presenter

如何解决input { stdin { } jdbc { type => "jdbc" .... } http_poller { type=>"api" .... } } filter { .... } output { elasticsearch { hosts => ["jlkjkljljkljk"] index => "%{type}_index" document_id => "%{id}" } stdout { codec => json_lines } } 为零的问题?

希望你们中的一些人能帮助我。

谢谢。

1 个答案:

答案 0 :(得分:0)

UITableView使用可重复使用的单元格,您可以在google中找到很多信息,这是文章之一

https://medium.com/ios-seminar/why-we-use-dequeuereusablecellwithidentifier-ce7fd97cde8e

因此,在AppDelegate中创建UITableViewCell实例时您什么都不做,它会立即处理

创建演示者

    // somewhere in your MainTabViewController
    let cellPresenter = ListCellPresenter(view: self)  

要注入演示者,您应该使用tableView(_:cellForRowAt:)方法

    // later in code
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! ListCell
        cell.inject(presenter: cellPresenter)

        if let item = presenter.item(row: indexPath.row) {
            cell.configure(item: item)
        }
        return cell
    }