我有一个内部有TableView的ViewController(VCA)。从该ViewController可以调用另一个ViewController(VCB)。在第二个VC中,可以将一个项目添加到用于在VCA中填充TableView的plist中。问题是,当我保存新项目并关闭VCB时,无法在VCA中重新加载TableView。

我发现了很多例子:

How can you reload a ViewController after dismissing a modally presented view controller in Swift?

How to call reload table view after you call dismissViewController in swift?

How to reload tableview from another view controller in swift

Update the data of a TableViewController after add item

Update the first view after dismissing Popover

Table view is not getting updated after dismissing the 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()
    }

但这是行不通的。我不
了解我错了。可以
你帮我?

编辑:我的解决方案
我以这种方式解决了:

我创建了一个单例,在其中声明:
    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)
}

最佳答案

您可以通过两种方式做到这一点:

1)
在VCA中做一件事

VCA

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

如果仍无法解决,请尝试此操作。

2)
在VCB中创建一个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
}

10-08 12:10