从另一个vc重新加载vc表视图支持的最佳方法

时间:2018-12-20 08:35:22

标签: ios swift tableview segue navigationcontroller

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

哪种方法是最好的? 谢谢!

5 个答案:

答案 0 :(得分:3)

在导航控制器中,这非常简单。在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()
        }
    

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

使用委托模式

使用某些方法为第二个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
    }

}

答案 3 :(得分:1)

要实现这一目标,首先要有多种解决方案,您必须了解哪种情况下最好使用

1-您是否正在将数据传递回CalculationVC

2-您是否仅需要在CalculationVC出现时重新加载?

在第一种情况下,请使用Delegates中称为 swift 的内容。

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

Delegate案例中,您可以在线找到大量this的文章,推荐给新手!

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

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

答案 4 :(得分:0)

尝试此代码

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