重新加载 vc table 视图支持的最佳方式 vc

Best way to reload vc table view backing from another vc

我正在尝试重新加载计算控制器中的 table 视图,按下设置控制器上的后退导航按钮(屏幕截图中的红色箭头)。

哪种方法最好? 谢谢!

一个简单的解决方案是在视图将再次出现时重新加载 tableView。

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

替代解决方案可能是实施 unwindSegue 或委托。

使用委托模式

使用某些方法为第二个 ViewController 创建委托。将此协议实现到第一个 ViewController,当调用此方法时,重新加载 UITableView 数据(在覆盖 prepare(for:sender:) 中将第二个 ViewController 的委托设置为 self)。当第二个ViewController 消失时,调用第二个ViewController.

delegate变量的方法

现在当您能够使用委托时,您可以轻松地向委托的方法添加参数并将数据从第二个传递到第一个 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
    }
    
}

要实现这一点,您有多种解决方案,首先您必须知道哪种方案最适合您的情况,

1- 您是否将数据传回 CalculationVC

2- CalculationVC 是否每次出现都需要重新加载?

对于第一种情况,您使用 Delegatesswift 中调用的内容。

对于第二种情况,您可以使用 ViewController 中称为 viewWillAppear() 的生命周期函数。

关于Delegate的案例你可以在网上找到大量的文章this推荐给新手的一篇!

对于第二种情况,只需使用此代码。

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

试试这个代码

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

在导航控制器中,这非常简单。在 Swift 中,最有效的方法是 回调闭包 ,它避免了 protocol/delegate.

的开销
  • SetupController中声明一个callback属性,一个没有参数也没有return类型的闭包

    var callback : (() -> Void)?
    

    并在viewWillDisappear中调用它。 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 = { 
            self.tableView.reloadData()
        }