Как вернуть View Controller через протокол - PullRequest
0 голосов
/ 20 апреля 2020

Проблема в том, что мне нужно вызвать функцию класса root внутри класса пользовательского табличного представления. Эта функция изменяет текст в главном окне. Мне нужно очень часто обновлять sh этот текст, поэтому я решил переопределить метод reloadData, чтобы добавить туда некоторые функции.

Я переопределяю метод reloadData.

protocol ReloadingDelegate {
    func returnHomeController() -> HomeController
}

class EntriesTableVIew: UITableView {

    var reload: ReloadingDelegate?

    override func reloadData() {
        super.reloadData()
        print("reloaded")

        let homeController = reload?.returnHomeController()
        homeController?.reloadBalance()
    }
}

Я пытаясь использовать протокол в HomeCotroller для передачи себя.

extension HomeController: ReloadingDelegate {

    func returnHomeController() -> HomeController {
        return self
    }

}

Я уверен, что делаю что-то не так, так как не до конца понимаю концепцию протоколов. Итак, основная проблема в двух словах: как я могу вызвать функцию из одного класса внутри другого класса; тем не менее, эта функция при прямом вызове из экземпляра класса возвращает ноль? Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вы можете напрямую передать свой 'viewController' в 'EntriesTableVIew' и затем вызвать нужный метод внутри 'reloadData', ps:

class EntriesTableVIew: UITableView {

   var homeController: HomeController?

   override func reloadData() {
       super.reloadData()
       print("reloaded")

       homeController?.updateLabel()
   }

   deinit {
       homeController = nil
   } 
}

class HomeController: UIViewController {

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

    func updateLabel() {
       print("Update label here")
    }
}
0 голосов
/ 20 апреля 2020

Я предлагаю вам взглянуть на замыкания, но протокол / делегат тоже могут это сделать. в своем классе вы забыли упомянуть, что вы являетесь «делегатом» в viewdidload HomeController должен объявить, что reload.delegate = self

...