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 }