Лучший способ перезагрузить резервную копию представления таблицы vc от другого vc - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь перезагрузить табличное представление в контроллере вычислений, нажимая кнопку навигации назад на контроллере установки (красная стрелка на скриншоте).

Какой лучший способ сделать это?Спасибо!

Ответы [ 5 ]

0 голосов
/ 20 декабря 2018

В навигационном контроллере это довольно просто.В Swift наиболее эффективным способом является закрытие обратного вызова , это позволяет избежать накладных расходов протокола / делегата.

  • В SetupController объявляется свойство callback,замыкание без параметра и без типа возврата

    var callback : (() -> Void)?
    

    и вызов его в viewWill Dis появляются .viewWillDisappear всегда вызывается при нажатии кнопки возврата.

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        callback?()
    }
    
  • В CalculationController назначить обратный вызов в prepare(for

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        ...
        let setupController = segue.destination as! SetupController
        setupController.callback = { [weak self] in 
            self?.tableView.reloadData()
        }
    
0 голосов
/ 20 декабря 2018

Попробуйте этот код

protocol VC2Delegate: class {
    func viewController(_ myVC2: VC2?, didFinishEditingWithChanges hasChanges: Bool)
}

class VC2 {
    private weak var: VC2Delegate? delegate?
    weak var: VC2Delegate? delegate?

    @IBAction func finishWithChanges() {
        delegate.viewController(self, didFinishEditingWithChanges: true)
    }

    @IBAction func finishWithoutChanges() {
        delegate.viewController(self, didFinishEditingWithChanges: false)
    }
}

//VC1: implement the VC2Delegate protocol
class VC1: VC2Delegate {
    var: Bool _needsReload?

    func awakeFromNib() {
        super.awakeFromNib()
        needsReload = true
    }

    func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        reloadTableIfNeeded()
    }
@IBAction func displayVC2() {
}
0 голосов
/ 20 декабря 2018

Использование шаблона делегата

Создание делегата с некоторым методом для второго ViewController.Реализуйте этот протокол для первого ViewController и, когда этот метод вызывается, перезагрузите данные UITableView (в переопределенном prepare(for:sender:) установите для делегата второго ViewController значение self).Когда второй ViewController исчезнет , вызовите метод для переменной delegate второго ViewController.

Теперь, когда вы можете использовать делегаты, вы можете легко добавить параметр в метод делегата и передать данныеот второго к первому ViewController.


protocol SecondVCDelegate: class { // define delegate protocol
    func controllerDismissed()
}

class ViewController: UIViewController {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "yourIdentifier" {
            let destinationVC = segue.destination as! SecondViewController
            destinationVC.delegate = self
        }
    }
}

extension ViewController: SecondVCDelegate {
    func controllerDismissed() { // this is called when you call delegate method from second VC
        tableView.reloadData()
    }
}

class SecondViewController: UIViewController {

    weak var delegate: SecondVCDelegate? // delegate variable

    override func viewWillDisappear(_ animated: Bool) {
        delegate?.controllerDismissed() // call delegate's method when this VC will disappear
    }

}
0 голосов
/ 20 декабря 2018

, чтобы достичь этого, у вас есть несколько решений, прежде всего вы должны знать, что лучше всего использовать в вашем случае,

1 - вы передаете данные обратно в CalculationVC

2 - вам просто нужно перезагрузить CalculationVC каждый раз, когда он появляется?

для первого случая вы используете то, что называется Delegates в swift.

для второго случая вы можете использовать функцию жизненного цикла, которая называется viewWillAppear() в ViewController.

для случая Delegate вы можете найти тонны статей в Интернете этот рекомендованный для новичков!

и для второго случая просто используйте этот код.

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}
0 голосов
/ 20 декабря 2018

Простым решением является перезагрузка tableView, когда представление появится снова.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}

Альтернативными решениями может быть реализация unwindSegue или Delegation.

...