【问题标题】:Best way to reload vc table view backing from another vc从另一个 vc 重新加载 vc 表视图支持的最佳方法
【发布时间】:2018-12-20 08:35:22
【问题描述】:

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

最好的方法是什么? 谢谢!

【问题讨论】:

  • 使用通知中心
  • viewwillAppear 是最好的。

标签: ios swift tableview segue navigationcontroller


【解决方案1】:

在导航控制器中它非常简单。在 Swift 中,最有效的方法是 回调闭包,它避免了协议/委托的开销。

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

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

【讨论】:

  • 谢谢@vadian!我想,在我的情况下,回调属性将在 setup vc 中。并且prepare(for: sender:)方法会在计算vc中。
【解决方案2】:

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

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

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

【讨论】:

  • 我同意。但由于他不拨打任何网络电话等 - 我相信他会接受这个解决方案:-)
  • 他没有提到任何关于在视图控制器之间传递数据的事情。
【解决方案3】:

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

1- 你是否将数据传回CalculationVC

2- 您是否只需要在每次出现 CalculationVC 时重新加载它?

对于第一种情况,您使用 swift 中的 Delegates

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

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

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

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

【讨论】:

    【解决方案4】:

    使用委托模式

    用一些方法为第二个 ViewController 创建委托。将此协议实现到第一个 ViewController 并在调用此方法时重新加载 UITableView 数据(在覆盖的 prepare(for:sender:) 中将第二个 ViewController 的委托设置为 self)。当第二个 ViewController消失时,调用第二个 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
        }
        
    }
    

    【讨论】:

    • 非常感谢,罗伯特!
    • @butkovskiym 没问题,我很高兴能帮上忙。还要检查@vadian 的答案,这是第二种选择。
    【解决方案5】:

    试试这个代码

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多