好,所以基本上我正在制作食物日记应用程序,并且我在用户输入新食物的View Controller和显示所有食物概览的View Controller /之间进行协议/委托通信。饭菜。 我的协议和委托代码-
protocol NewEntryDelegate: class {
func getCalorieDataFromNewEntry(data: Int)
}
-------
//NewEntryViewController
weak var delegate: NewEntryDelegate?
------
//OverviewViewController
func getCalorieDataFromNewEntry(data: Int) {
totalCals += data
defaults.set(totalCals, forKey: "totalCalories")
}
我在概述VC中有一个属性,用于存储当天食物的总热量,并且每次用户在NewEntryVC中创建新条目时,该条目的卡路里应发送回概述VC,加上目前的总数。 我对此的代码以前运行正常(NewEntryVC嵌入到其他导航控制器中,因为它以模态形式显示,我想要一个导航栏)(精简代码)-
class OverviewViewController: UIViewController, UITableViewDelegate,
UITableViewDataSource, NewEntryDelegate {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToNewEntry" {
let navController = segue.destination as! UINavigationController
let viewController = navController.topViewController as! NewEntryViewController
viewController.delegate = self
}
但是,我现在在两个视图控制器之间添加了一个新的PopUpViewController- Storyboard
现在我无法弄清楚如何从OverviewVC到达NewEntryVC的相同实例以设置委托。我尝试将OverviewController的prepare(for segue :)方法中的代码更改为navController.topViewController.presentedViewController as! NewEntryViewController
但这没用。我还尝试过将NewEntryVC设为PopUpVC的子VC,但这也不起作用。我还尝试在PopUpVC类而不是OverviewVC类中设置委托。
class PopUpNewEntryViewController: UIViewController {
if segue.identifier == "goToNewEntry" {
let destVC = segue.destination as! NewEntryViewController
destVC.delegate = self.navigationController.presentingViewController as? NewEntryDelegate
但还是没有运气。
我已经看过所有与此类似的帖子,但是找不到适合我问题的解决方案。我应该仍然使用协议/代理通信,还是使用Notification / Observer更好?如果有人可以提出任何建议,将不胜感激!如果您需要查看我的代码,请告诉我。
谢谢!