我有一个带有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)
}
答案 0 :(得分:2)
你可以用两种方式做到这一点: -
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
}
答案 1 :(得分:0)
这里,当尚未显示viewcontroller时,您正在调用表的重载数据。即使在您解除了viewcontroler VCB并且显示了viewcontroller VCA之前,您也在调用reloadData。
尝试在VCA的viewWillAppear(animated: Bool)
功能中调用重新加载数据。
答案 2 :(得分:0)
试试这个:进行如下更改
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
}
答案 3 :(得分:0)
你问题中的代码非常好。我使用相同的方法,它就像一个魅力。 恕我直言您的代码中的问题是您只使用 self.tableView.reloadData()刷新表格视图,但可能是您忘记刷新数据模型 - 数据表视图的源代码。例如。如果从Core Data中删除实体,则需要重新获取数据,然后才重新加载表视图。
答案 4 :(得分:0)
我设法使用通常用于在视图控制器之间传递数据的委托/协议来做到这一点,但在这种情况下,我只是调用了该函数而没有传递数据,并且我在此函数内部放入了(tableView.reloadData())并且它起作用了就像一个甜:)
让google“在视图控制器之间传递数据并使用我在上文中说明的方法”