当您从另一个视图控制器发出信号时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?

对不起,问题有点长。 请多多包涵。

基本上,我正在尝试使用swift编写一个简单的计数/倒计时ios应用程序。 我有三个主视图控制器。 一个是“初始视图控制器”(它是根视图控制器),它只包含两个按钮 – 一个按模块呈现给实际计数页面(第二个视图控制器),另一个按模式呈现给tableViewController页面(第三个视图控制器)。 那些是三个视图控制器。

因此,如果用户选择保存他们一直在计数的计数器,我想将该计数器视图控制器上的数据附加到我创建的数组以显示在tableViewController上。 所以我让tableViewController成为Counter View Controller的委托,将数据附加到数组中。

至于我的理解,你需要在tableViewController中实现prepareSegue,以将tableViewController连接到Counter View Controller。 但是,因为计数器视图控制器的segue不是来自tableViewController而是来自初始视图控制器,所以prepareSegue函数不起作用,因此委托不起作用。 因此,为了简化我的问题 – 当您从另一个视图控制器发出信号时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?

我希望我的问题很明确。 我对软件开发完全不熟悉,也不确定我是否有任何意义。 非常感谢你的帮助!

解决方案1(使用通知):

每次在CounterViewController中更新计数器时,都需要执行以下代码:

let notification = Notification.init(name: NSNotification.Name(rawValue: "UpdateCounter"), object: NSNumber.init(value: 1), userInfo: nil) NotificationCenter.default.post(notification) 

此代码在初始视图控制器中实现(以观察计数器中的更改):

 override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, selector: #selector(parseNotification(_:)), name: NSNotification.Name.init(rawValue: "UpdateCounter"), object: nil) } func parseNotification(_ notification: Notification?) { if let number = notification?.object as? NSNumber { /** here counter is a class variable in Initial ViewController **/ counter = number.intValue } } 

并在初始视图控制器中的prepareforSegue中添加以下代码

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { //Condition to check if TableViewController is being opened tableViewController.counter = counter } 

不要忘记删除初始视图控制器中的观察者:

 deinit { NotificationCenter.default.removeObserver(self) } 

解决方案2(使用全局/共享变量):创建全局/共享变量,例如

 class Shared { var value = 0 let instance = Shared() } 

在CounterViewController中,每次更新计数器时都设置值

 Shared.instance.value = counterValue 

您可以使用以下代码读取TableViewController中的值:

 Shared.instance.value 

如果故事板路径中有三个控制器,一个 – >两个 – >三个,并且您希望One知道三个中的数据更改,那么您需要通过二传播更改。

粗略的版本可能如下所示:

 protocol CountDelegate: class { func updateCount() } class One: UIViewController, CountDelegate { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let destination = segue.destination as? Two else { return } destination.delegate = self } func updateCount() { // whatever } } class Two: UIViewController { weak var delegate: CountDelegate? override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let destination = segue.destination as? Three else { return } destination.delegate = self.delegate // just pass the delegate down } } class Three: UIViewController { weak var delegate: CountDelegate? func doWork() { self.delegate?.updateCount() } } 

所以代表是一个,并且两个和三个(通过两个)指向它作为代表。