例如,我的应用有3个ViewController: A,B,C 我使用Segue移动 A-> B-> C 。我的问题是在ViewController C 上,我想直接获取ViewController A 的数据,而不传递 A-> B 中的数据,然后< strong> B-> C 。 有可能吗?
更多信息:我制作了一个包含很多步骤的表单(步骤A-> B-> C然后提交)。因此,在最后一步,我想在每一步中收集所有用户的输入并提交。
如何在最后一步获取所有数据?
1。暂时将数据存储在某个地方,然后进入最后一步
2。在最后一步,通过魔术直接获取每个步骤的数据吗?
答案 0 :(得分:2)
您可以在A
和C
之间创建序列。
然后在A
视图控制器中,检查destination
视图控制器:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let aVC = segue.destination as? aVC {
// pass data to A view controller
} else if let bVC = segue.destination as? bVC {
// pass data to B view controller
}
编辑
如果要在视图控制器A
,B
和C
之间共享表单数据,则可以创建一个Signleton
类,并将所有表单数据设置为一个变量:
class FormData {
static let shared = FormData()
private init() {}
var formData: String = "variable containing the form data"
}
要在视图控制器C
中获取表单数据,请使用:
let myFormData = FormData.shared.formData
答案 1 :(得分:1)
如果您使用的是NavigationController
,则可以通过寻址它的viewControllers[index]
来访问通过它直接推送到它的每个控制器。
例如,您可以通过覆盖默认类来使用自定义NavigationController
,并将每个步骤的数据存储在其中,所有推入其中的视图控制器都可以访问它,而在C中,您可以像这样检索它们:>
let navVC = self.navigationController as? YourCustomNavigationController
let data = navVC.getData()
或只是暂时将数据保存在AppDelegate
中,可以在应用程序中的任何位置访问它,不建议这样做,因为这会使代码变脏
如果它没有帮助,请给我更多有关您的应用程序结构以及您打算做什么的信息:)
创建一个新的可可触摸类,并将其命名为:CustomNavigationController
,并将其命名为UINavigationController
的 subclass ,如果您使用的是故事板,请设置导航控制器类,该类< strong> A 被推入接口构建器中的CustomNavigationController
(在“身份检查器”选项卡下)
然后,您可以将属性和方法添加到CustomNavigationController
中,例如:
var data : AnyObject?
func storeData(data:AnyObject){
}
func getData() -> AnyObject? {
return data
}
然后从任何视图控制器将值传递给导航控制器:
let navVC = self.navigationController as! CustomNavigationController
navVC.storeData(data: myData)
}