现在我有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中删除一个单元格时,我被推送到VC2并且它不在那里的单元格。但是,如果我按下后退按钮,它会将我带到我删除的上一个单元格,如果单元格不存在,我不想让它带我到那里。我希望它带我去VC1(家)。
我该如何做到这一点?
也许我应该以另一种方式做到这一点而不是那样推动?
答案 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。您将返回页面。
希望这有帮助。