【发布时间】:2018-12-20 08:35:22
【问题描述】:
【问题讨论】:
-
使用通知中心
-
viewwillAppear 是最好的。
标签: ios swift tableview segue navigationcontroller
【问题讨论】:
标签: ios swift tableview segue navigationcontroller
在导航控制器中它非常简单。在 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()
}
【讨论】:
一个简单的解决方案是在视图将再次出现时重新加载 tableView。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
替代解决方案可能是实施 unwindSegue 或委托。
【讨论】:
要实现这一点,您有多种解决方案,首先您必须知道哪种方案最适合您的情况,
1- 你是否将数据传回CalculationVC
2- 您是否只需要在每次出现 CalculationVC 时重新加载它?
对于第一种情况,您使用 swift 中的 Delegates。
对于第二种情况,您可以使用ViewController 中称为viewWillAppear() 的生命周期函数。
对于Delegate 案例,您可以在网上找到大量文章this 推荐给新手的一篇!
对于第二种情况,只需使用此代码。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
【讨论】:
用一些方法为第二个 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
}
}
【讨论】:
试试这个代码
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() {
}
【讨论】: