[英]Reload tableView after dismiss a viewController
我有一個 ViewController(VCA),里面有一個 TableView。 從這個 ViewController 可以調用另一個 ViewController (VCB)。 在這第二個 VC 中,可以向用於填充 VCA 中的 TableView 的 plist 添加一個項目。 問題是當我保存新項目並關閉 VCB 時,我無法在 VCA 中重新加載 TableView。
我找到了很多例子:
在 Swift 中關閉模態呈現的視圖控制器后,如何重新加載 ViewController?
在swift中調用dismissViewController后如何調用重新加載表視圖?
閱讀后,我嘗試使用此代碼:
**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
}
在這里,當視圖控制器尚未顯示時,您正在調用表的重新加載數據。 即,即使在您關閉 viewcontroler VCB 並顯示 viewcontroller VCA 之前,您也正在調用 reloadData。 嘗試在 VCA 的viewWillAppear(animated: Bool)
函數中調用重新加載數據。
試試這個:進行如下更改
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
}
您問題中的代碼非常好。 我使用相同的方法,它就像一個魅力。 恕我直言,您的代碼中的問題是您只使用self.tableView.reloadData()刷新表視圖,但您可能忘記刷新數據模型- 表視圖的數據源。 例如,如果您從 Core Data 中刪除了一個實體,那么您需要重新獲取您的數據,並且只有在重新加載表視圖之后。
我設法使用通常用於在視圖控制器之間傳遞數據的委托/協議來做到這一點,但在這種情況下,我只是在不傳遞數據的情況下調用了該函數,並在該函數內部放置了( tableView.reloadData() ),它的工作方式很甜蜜:)
突出谷歌“在視圖控制器之間傳遞數據並使用我上面解釋的方法”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.