【问题标题】:Xcode 10, Swift 4 - How do I transfer data across multiple view controllers? [duplicate]Xcode 10, Swift 4 - 如何跨多个视图控制器传输数据? [复制]
【发布时间】:2019-06-28 04:29:31
【问题描述】:

我目前正在开发一个应用程序,但在发布活动时遇到了问题。

我在多个视图(7 个屏幕)的序列中收集数据,并希望最终一次存储数据(或在最终视图中显示所有数据)。 例如,这些数据是位置信息、用户信息、事件图像、cmets、事件类别…… 如果我在一两个视图中收集数据,我知道如何将数据存储在数据库/存储(firebase)中。 但在我的用例中,我有七个视图,但我找不到任何优雅的方法。

使用 Xcode 10 最好的方法是什么?

【问题讨论】:

  • 它已被标记为重复的人,无需投票。你可以看到这个人离开了社区。人们需要冷静下来。

标签: ios swift firebase uiviewcontroller swift4


【解决方案1】:

您可以使用下面的代码结构。为这个结构中的所有屏幕制作所有必需的变量(如字符串、图像等)。您可以从任何 ViewController 访问它。

struct InputDetails {
    static var details: InputDetails = InputDetails()

    var city: String = ""
    var lat: String = ""
    var long: String = ""
}

现在来增加价值

InputDetails.details.city = textfiels.text

现在访问最后一屏中的第一屏值

print(InputDetails.details.city)

一旦您的 API 调用或以上结构使用结束,请确保重置所有详细信息,如下所示。

InputDetails.details = InputDetails()

【讨论】:

  • 这是一个非常简单而酷的解决方案,我使用它并且效果很好。我知道这可能是一个初学者的问题,但我确实想问一件事:静态变量究竟是如何工作的?它有什么作用?
  • 我们创建一个结构(InputDetails)并将它的值保存在一个静态变量(var details)中,因此,一旦我们将值存储在静态变量中,它将保持它的值,直到我们再次初始化它(InputDetails() )
【解决方案2】:

在视图控制器之间传递数据有多种方式。例如,您可以使用实例属性或 segue 或委托方法。

我建议您阅读这篇文章,该文章全面介绍了不同的方法以及如何应用它们:

How To: Pass Data Between View Controllers In Swift

编辑:

在检查您问题中的图片后,我认为使用 segue 将是最合适的解决方案。如图所示,您在一个视图控制器中输入数据,将其传递到第二个视图控制器,最后将所有数据上传到 Firebase。

我假设您使用情节提要(如果没有,请参阅上面的链接了解其他方法。)在下面的示例中,您会将字符串从一个 VC 传递到另一个。

第 1 步:

在两个视图控制器之间添加一个转场。故事板 -> 按 ctrl 并单击 VC 1 并拖动鼠标 -> 你会看到一个蓝色箭头,将其拖到 VC 2 并释放 -> 选择手动转场:显示 -> 单击转场并给它一个标识符

第 2 步:

在VC二中,做一个字符串变量:

class SecondViewController: UIViewController {
var stringToPass: String = ""

    override func viewDidLoad() {
    super.viewDidLoad()

    print(stringToPass)
}

第 3 步: 在 VC 一中,输入以下内容:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let vc = segue.destination as? SecondViewController {
vc.stringToPass = "This is the string we pass between two VC"
     }
}

第 4 步: 然后每当你想去 SecondViewController 像这样执行 segue:

performSegue(withIdentifier: "identifierYouEntered", sender: self)

【讨论】:

  • 你介意告诉我为什么投反对票吗?你认为我哪里错了?
  • 非常感谢 :-) :-) :-) 一个精彩的回答
  • 与否决票有关,那不是我。对不起,我不能给你额外的积分,因为我的声望少于 15 :-)
  • 我不知道为什么有人会投反对票;这是一个很好的答案,所以我很赞成。但是.. OP 没有询问在视图之间移动,所以不需要 segue 信息 - 似乎他已经把那部分记下来了。代替字符串,创建一个 PersonClass 对象并通过 viewContollers 将其传递,在进行时填写属性,然后将 PersonObject 属性写入 Firebase。另一个选项是 viewCoordinator,主视图根据需要创建每个视图并“保存”PersonClass 数据。当每个视图完成时,数据会传回协调器以填充类。
  • 哦,这里有更深入的解释 Pass Model between view controllers
猜你喜欢
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-10-20
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多