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