Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 从一个ViewController转到另一个ViewController并更新_Swift_Uitableview_Swift3 - Fatal编程技术网

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

Swift 从一个ViewController转到另一个ViewController并更新,swift,uitableview,swift3,Swift,Uitableview,Swift3,现在我有3个视图控制器,如下所示: HomeViewcontroller = VC1. Viewcontroller2 = VC2 --> has a table view with cells on it. Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete. let viewController = storyboard?.instantiateViewController(withIde

现在我有3个视图控制器,如下所示:

HomeViewcontroller = VC1.
Viewcontroller2 = VC2 --> has a table view with cells on it.
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete.
let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
self.navigationController?.pushViewController(viewController!, animated: true)
我在ViewController之间使用
NavigationController
,以获得漂亮的“后退”按钮:)

假设我在VC1中,我按下一个按钮,然后转到VC2。 现在让我们假设我有4个细胞。 我按2号单元格,然后进入VC3,在那里我可以编辑单元格中的内容,甚至可以将其删除。 这是所有工作正常(测试它)

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

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

HomeViewcontroller = VC1.
Viewcontroller2 = VC2 --> has a table view with cells on it.
Viewcontroller3 = VC3 --> allows me to edit each cell in VC2 or delete.
let viewController = storyboard?.instantiateViewController(withIdentifier: "VC2") as! VC2!
self.navigationController?.pushViewController(viewController!, animated: true)
问题是,当我这样做时,我会转到VC2,但我没有重新加载我的tableView,因为它应该在那里(被擦除的单元格仍然在那里)

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

self.tableView.reloadData()
现在我设法做到了。我的意思是,当我从VC3中删除一个单元格时,我被推到VC2,而该单元格不在那里。但是,如果我按下后退按钮,它会将我带到我已删除的上一个单元格,,,如果该单元格不再存在,我不希望它将我带到那里。我想让它带我去VC1(家)

我怎样才能做到这一点


也许我应该用另一种方式来做这件事,而不是像那样推动?

将您的
self.tableView.reloadData()
放在
视图的覆盖中将出现
<代码>viewDidLoad
仅在创建viewController后调用一次,但每次它将出现在屏幕上时都会调用
ViewWillAspect

另外,不要使用推送从VC3返回VC2。您应该弹出当前的viewController

self.navigationController?.popViewController(animated: true)

实际上,您做错了,当在VC3上完成删除/编辑操作并希望在VC2上返回时,为什么要执行
pushViewController
,您必须应用
popViewController

您必须应用
self.navigationController?.popViewController(动画:true)
从VC3返回VC2

删除

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

self.navigationController?.popViewController(animated: true)
同时

self.navigationController?.popViewController(animated: true)
视图中为表视图放置
reloadData()
方法将出现
。就像下面的代码

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

    self.tableView.reloadData()

}
一些有关UINavigationController的参考资料。


您需要创建一个委托,并在
视图控制器2中实现该委托,而不是从
视图控制器3
再次按下
视图控制器2
,现在在
视图控制器3
中创建该委托的实例,并在从
视图控制器2
移动时设置该委托至
视图控制器3
。现在,当您更新或删除
ViewController2
的数据时,只需使用该委托从
ViewController2
调用方法,并在该方法内更新数据源并重新加载
表视图

通常,当导航控制器中嵌入了不同的视图控制器时,向上推堆栈,然后从堆栈中弹出。据我所知,您似乎只是在堆栈上推送新的视图控制器

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

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

我假设您有一个模型对象,其中包含VC2和VC3表视图中的数据。删除单元时,应删除模型对象中的单元,而不是在堆栈上推送新的VC2,而是关闭VC3。您可以通过连接删除按钮的VC2中的@iAction执行此操作。然后,它会从堆栈中弹出VC3,您将在iAction方法中返回VC2,您已将delete按钮链接到该方法。导航控制器在堆栈上也只有两个视图控制器,即VC1和VC2

在该iAction方法中,您可以重新加载表视图,表视图将调用datasource方法

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
此方法将查看您的模型对象,但找不到已删除的数据,因此您的单元格将消失

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


希望这有帮助。

和我的答案一样。试过了。你说得对。就这样。谢谢。我会检查它,并阅读它的肯定很好,保持愉快的编码。很好的答案。和我的答案一样+1兄弟。你对
popViewController
的观察非常好。试过了。你说得对。就这样。非常感谢汉克斯给我解释。我知道出了什么问题。再次感谢