对不起,这个问题有点长。请忍受我。
基本上,我正在尝试使用swift编写一个简单的递增/递减ios应用程序。我有三个主要的视图控制器。一个是“初始视图控制器”(即根视图控制器),它仅包含两个按钮-一个以模态形式显示在实际计数页面上(第二个视图控制器),另一个以模态形式显示在tableViewController页面上(第三个视图控制器)。这就是三个视图控制器。
因此,如果用户选择保存他们一直在计数的计数器,那么我想将该计数器视图控制器上的数据附加到我创建的要在tableViewController上显示的数组中。因此,我使tableViewController成为Counter View Controller的委托,以将数据附加到数组。
据我了解,您需要在tableViewController中实现prepareSegue才能将tableViewController连接到Counter View Controller。但是,由于对Counter View Controller的选择不是源自tableViewController,而是源自Initial View Controller,因此prepareSegue函数不起作用,因此委托不起作用。因此,为了简化我的问题:当您从另一个视图控制器中选择数据时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?
我希望我的问题很清楚。我对软件开发是完全陌生的,不确定是否有意义。非常感谢您的帮助!
答案 0 :(得分:1)
如果故事板路径中有三个控制器,一个->两个->三个,而您想让一个知道三个中的数据更改,则需要通过两个传播更改。
一个粗略的版本可能看起来像这样:
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()
}
}
所以委托是一个,并且两个和三个(通过两个)都指向它作为委托。
答案 1 :(得分:0)
解决方案1(使用通知):
每次在CounterViewController中更新计数器时,都需要执行以下代码:
let notification = Notification.init(name: NSNotification.Name(rawValue: "UpdateCounter"), object: NSNumber.init(value: 1), userInfo: nil)
NotificationCenter.default.post(notification)
此代码在Initial View Controller中实现(以观察计数器的变化):
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