从一个ViewController转到另一个ViewController并更新

时间:2016-11-23 12:20:27

标签: swift uitableview swift3

现在我有3个像这样的Viewcontrollers:

HomeViewcontroller = VC1.
Viewcontroller2 = VC2 --> has a table view with cells on it.
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete.

我在Viewcontrollers之间使用NavigationController来获得漂亮的“后退”按钮:)

让我们说我在VC1,按下按钮然后我去VC2。 现在让我们说我有4个细胞。 我按下单元格编号2然后我转到VC3,在那里我可以编辑单元格中的内容甚至删除它。 这一切都运行正常(经过测试)。

假设我要删除该单元格。我在VC3上有一个按钮,我使用它,我删除了单元格(这已经过测试,也可以正常工作)。

现在,当我这样做时,我再次推入VC2:

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
self.navigationController?.pushViewController(viewController!, animated: true)

问题在于,当我这样做时,我会转到VC2,但我没有重新加载我的tableView它应该(擦除的单元格仍然存在)。

为了解决这个问题,我尝试在VCD中添加一些代码,在viewDidLoad:

self.tableView.reloadData()

现在我设法做到了。我的意思是当我从VC3中删除一个单元格时,我被推送到VC​​2并且它不在那里的单元格。但是,如果我按下后退按钮,它会将我带到我删除的上一个单元格,如果单元格不存在,我不想让它带我到那里。我希望它带我去VC1(家)。

我该如何做到这一点?

也许我应该以另一种方式做到这一点而不是那样推动?

4 个答案:

答案 0 :(得分:2)

self.tableView.reloadData()置于viewWillAppear的覆盖范围内。 viewDidLoad仅在创建viewController后调用一次,但每次在屏幕上显示时都会调用viewWillAppear

另外,请勿使用push从VC3返回VC2。你应该弹出当前的viewController。

self.navigationController?.popViewController(animated: true)

答案 1 :(得分:2)

实际上你做错了,当在VC3上完成删除/编辑操作并且你想回到VC2上时,为什么你要做pushViewController,你必须申请popViewController

你必须从VC3申请self.navigationController?.popViewController(animated: true)回到VC2。

删除

let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
self.navigationController?.pushViewController(viewController!, animated: true)

添加

self.navigationController?.popViewController(animated: true)

reloadData()方法放在viewWillAppear的表格视图中。如下面的代码。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.tableView.reloadData()

}

有关UINavigationController的一些参考资料。

https://developer.apple.com/reference/uikit/uinavigationcontroller

答案 2 :(得分:1)

而不是从ViewController2再次推送ViewController3,您需要创建一个委托并在ViewController2中实现该委托,现在在viewController3中创建该委托的实例并设置当您从ViewController2转移到ViewController3时代表该代表。现在,当您更新或删除ViewController2的数据时,只需使用该委托从ViewController2调用方法,并在该方法内更新您的DataSource并重新加载tableView

答案 3 :(得分:1)

<磷>氮。,

通常情况下,当导航控制器中嵌入了不同的视图控制器时,您可以向上推动堆栈并从堆栈弹回。据我了解你的故事,似乎你只是在堆栈上推送新的视图控制器。

您的第一个视图控制器是VC1。您按下一个按钮,然后在堆栈VC2上推送新的视图控制器。导航控制器现在在堆栈VC1和VC2上有2个视图控制器。然后在VC2的表视图中选择一个单元格,它将转到VC3。

导航控制器现在在堆栈VC1,VC2和VC3上保存3个视图控制器。现在你删除一个单元格并在堆栈上推送一个新的视图控制器,这也是一个VC2,但是一个新的。导航控制器现在在堆栈VC1,VC2,VC3上有四个视图控制器,另一个VC2实例。

我假设您有一个模型对象,其中包含VC2和VC3的表视图中的数据。删除单元格时,应删除模型对象中的单元格,而不是在堆栈上推送新的VC2,而是取消VC3。您可以使用连接删除按钮的VC2中的@IBAction执行此操作。然后它从堆栈中弹出VC3,然后在已链接删除按钮的IBAction方法中返回VC2。然后导航控制器再次在堆栈上有2个视图控制器,VC1和VC2。

在那个IBAction方法中,您可以重新加载表视图,表视图将调用数据源方法

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

此方法将查看您的模型对象,但未找到已删除的数据,并且您的单元格已消失。

然后按下后退按钮,导航控制器将VC2从堆栈中推出,并且只剩下一个视图控制器VC1。您将返回页面。

希望这有帮助。