当您从另一个视图控制器发出信号时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?
对不起,问题有点长。 请多多包涵。
基本上,我正在尝试使用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() } }
所以代表是一个,并且两个和三个(通过两个)指向它作为代表。