2017-06-13 179 views
2

我有一个ViewController(VCA)与TableView里面。从这个ViewController可以调用另一个ViewController(VCB)。在第二个VC中,可能会向用于在VCA中填充TableView的plist添加一个项目。问题是,当我保存新项目并关闭VCB时,我无法在VCA中重新加载TableView。关闭viewController后重新加载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 

现在,在saveButto VCB的N,我可以打电话:

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

你如何转向VCB?显示它的代码 –

+0

白衣从VCA中的按钮简单连接 –

+0

@Aravind A R感谢提示 –

回答

0

这里你调用表的重新加载数据时,没有表现出的视图 - 控制。即使在解除viewcontroler VCB和viewcontroller VCA的显示之前,您仍在调用reloadData。 尝试在VCA的viewWillAppear(animated: Bool)函数中调用重新加载数据。

+0

不幸的是,我不明白为什么,解雇VCA后不记得viewWillAppear。 –

+0

如果你显示的VCB来自VCA,那么在解散VCB后,VCA的viewWillAppear将被称为 –

+0

Hi @Aravind A R,可能我犯了一些错误,我是一个新手。但我发现了一个解决方案,我已经在我的问题下添加了。谢谢你的时间 –

0

可以通过两种方式做到这一点: -

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 
} 
+0

谢谢,但不工作。 –

+0

你能告诉我你试过什么吗? –

+0

嗨@Ayush sharma,我用适合我的解决方案编辑了我的问题。谢谢你的时间 –

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 

    } 
+0

不幸的是不工作 –

+0

我检查了你的代码。它正在使用这个解决方案。 – KKRocks

+0

你可以在这里添加你的尝试代码。 – KKRocks

0

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

+0

谢谢你的建议,我解决了使用单例 –

+0

是的,我知道。我发布了它,因为那是我的问题。可能会帮助面临类似问题的人。 –