繁体   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