簡體   English   中英

關閉 viewController 后重新加載 tableView

[英]Reload tableView after dismiss a viewController

我有一個 ViewController(VCA),里面有一個 TableView。 從這個 ViewController 可以調用另一個 ViewController (VCB)。 在這第二個 VC 中,可以向用於填充 VCA 中的 TableView 的 plist 添加一個項目。 問題是當我保存新項目並關閉 VCB 時,我無法在 VCA 中重新加載 TableView。

我找到了很多例子:

在 Swift 中關閉模態呈現的視圖控制器后,如何重新加載 ViewController?

在swift中調用dismissViewController后如何調用重新加載表視圖?

如何快速從另一個視圖控制器重新加載 tableview

添加項目后更新TableViewController的數據

關閉 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
}

在這里,當視圖控制器尚未顯示時,您正在調用表的重新加載數據。 即,即使在您關閉 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM