closuresviewController后重新加载tableView
我有一个ViewController(VCA)与一个TableView里面。 从这个ViewController可以调用另一个ViewController(VCB)。 在第二个VC中,可能会向用于在VCA中填充TableView的plist添加一个项目。 问题是当我保存新项目并closuresVCB时,我无法重新加载VCA中的TableView。
我发现了很多例子:
你怎样才能重新加载视图控制器在Swift中解除模态表示的视图控制器?
在swift中调用dismissViewController之后如何调用reload table view?
如何在swift中从另一个视图控制器重新加载tableview
添加项目后更新TableViewController的数据
解散Popover后更新第一个视图
表视图没有得到更新后解散popover?
阅读后我试着用这个代码:
**IN VCB** import UIKit protocol AddItemDelegateProtocol { func didAddItem() } class VCB: UIViewController { var delegate : AddItemDelegateProtocol? ... } @IBAction func saveButton(_ sender: Any) { .... self.delegate?.didAddItem() dismiss(animated: true, completion: nil) } **In VCA** class VCA: UIViewController, UITableViewDelegate, UITableViewDataSource, AddItemDelegateProtocol { let addItemVC = VCB() ... override func viewDidLoad() { super.viewDidLoad() addItemVC.delegate = self ... } func didAddItem() { self.tableView.reloadData() }
但是这不起作用。 我不明白我错在哪里。 你可以帮帮我吗?
编辑:我的解决scheme,我这样解决:
我创build了一个单例,我声明:
class DataManager { static let shared = DataManager() var firstVC = VCA() ..... }
那么, 在VCA的viewDidLoad中 :
DataManager.shared.firstVC = self
现在, 在VCB的saveButton中 ,我可以调用:
@IBAction func saveButton(_ sender: Any) { ........ DataManager.shared.firstVC.tableView.reloadData() dismiss(animated: true, completion: nil) }
在这里你调用表的重新加载数据,当viewcontroller还没有显示。 即,即使在解除viewcontroler VCB和viewcontroller VCA之前,您正在调用reloadData。 尝试在VCA的viewWillAppear(animated: Bool)
函数中调用重载数据。
你可以用两种方法做到这一点:
1)
VCA做一件事
VCA
override func viewWillAppear(_ animated: Bool){ tableView.reloadData() }
如果这不起作用,那么试试这个。
2)在VCB中创build一个VCA实例,并且每当从VCA移动到VCB时,将VCA的值传递给VCB的实例,并从那里重新加载表。
VCB
var instanceOfVCA:VCA! // Create an instance of VCA in VCB func saveButton(){ instanceOfVCA.tableView.reloadData() // reload the table of VCA from the instance dismiss(animated: true, completion: nil) }
VCA
override func prepare(for segue: UIStoryboardSegue, sender: Any!) { VCB.instanceOfVCA = self // Pass the value of VCA in instance of VCB while navigating through segue }
试试这个:如下进行更改
let addItemVC : VCB? = nil
在ViewDidLoad中
override func viewDidLoad() { super.viewDidLoad() addItemVC = (storyboard?.instantiateViewController(withIdentifier: "ViewControllerID") as! SelectionViewController?)! // change ViewControllerID with your controller id addItemVC.delegate = self }