【问题标题】:Reload tableView after dismiss a viewController关闭 viewController 后重新加载 tableView
【发布时间】:2017-11-14 23:37:38
【问题描述】:

我有一个 ViewController(VCA),里面有一个 TableView。从这个 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 的保存按钮中,我可以调用:

@IBAction func saveButton(_ sender: Any) {
    ........
    DataManager.shared.firstVC.tableView.reloadData()
    dismiss(animated: true, completion: nil)
}

【问题讨论】:

  • 你是如何迁移到这个 VCB 的?显示它的代码
  • 通过 VCA 中的按钮进行简单连接
  • @Aravind A R 感谢您的提示
  • 您的解决方案解决了我的问题!感谢您的提示
  • 很高兴有用

标签: ios uitableview uiviewcontroller


【解决方案1】:

当视图控制器尚未显示时,您正在调用表的重新加载数据。即,即使在您关闭 viewcontroler VCB 并显示 viewcontroller VCA 之前,您也在调用 reloadData。 尝试在 VCA 的 viewWillAppear(animated: Bool) 函数中调用 reload data。

【讨论】:

  • 不幸的是,我不明白为什么,在关闭 VCA 后不记得 viewWillAppear。
  • 如果你是从 VCA 显示 VCB,那么在关闭 VCB 后,将调用 VCA 的 viewWillAppear
  • 嗨@Aravind A R,可能我犯了一些错误,我是新手。但我找到了在我的问题下添加的解决方案。感谢您的宝贵时间
【解决方案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
}

【讨论】:

  • 嗨@Ayush sharma,我已经用适合我的解决方案编辑了我的问题。感谢您的宝贵时间
【解决方案3】:

试试这个:进行如下更改

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

    }

【讨论】:

  • 我已经检查了你的代码。它正在使用此解决方案。
  • 嗨@KKRocks,我已经用我找到的解决方案编辑了我的问题。谢谢你的时间
【解决方案4】:

您问题中的代码非常好。我使用相同的方法,它就像一个魅力。 恕我直言,您的代码中的问题是您仅使用 self.tableView.reloadData() 刷新表格视图,但可能是您忘记了 刷新您的数据模型 - 数据表格视图的来源。例如。如果你从 Core Data 中删除了一个实体,那么你需要重新获取你的数据,并且只有在重新加载表格视图之后。

【讨论】:

  • 谢谢你的建议,我用单例解决了
  • 是的,我知道。我发布了它,因为那是我的问题。可能会对面临类似问题的人有所帮助。
【解决方案5】:

我设法使用通常用于在视图控制器之间传递数据的委托/协议来做到这一点,但在这种情况下,我只是在不传递数据的情况下调用了该函数,并且在该函数中放入了(tableView.reloadData())并且它起作用了像一个甜蜜的:)

juts google“在视图控制器之间传递数据并使用我上面解释的方法”

【讨论】:

    猜你喜欢
    • 2020-03-25
    • 2021-05-28
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多