Как внедрить докладчик в CustomTableViewCell в качестве инъекции зависимости - PullRequest
0 голосов
/ 09 июля 2019

Я изучаю Dependency Injection и создал приложение MVP.

Я мог бы внедрить докладчиков для нескольких VC в AppDelegate, используя раскадровку.

Но теперь я создал CustomTableViewCellс .xib, который имеет UIButton в ячейке, так что я хотел бы обработать детали этого в файле докладчика.

Я попытался создать UINib(nibName~ в AppDelegate, но когда докладчик вCustomTableViewCell называется, это nil.

Я слышал, что экземпляр ячейки с именем в AppDelegate будет удален.Однако я не знаю способов не сделать 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
    }

VC, для которого tableViewDataSource написано

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
    }
}


customTableViewCell

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) {
    ・・・
    }
}

клеточный ведущий

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 - ноль?

Надеюсь, некоторые из вас помогут мне.

Спасибо.

1 Ответ

0 голосов
/ 09 июля 2019

UITableView использует многократно используемые ячейки, вы можете найти много информации в Google, вот одна из статей

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

Итак, создавая экземпляр UITableViewCell в AppDelegate, вы ничего не делаете, он сразу же удаляется

Создать докладчика

    // 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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...