【问题标题】:Passing Data between View Controllers without segue [duplicate]在视图控制器之间传递数据而无需 segue [重复]
【发布时间】:2018-08-14 19:19:34
【问题描述】:

我的设计碰壁了。我正在尝试将字符串从一个视图控制器传递到另一个视图控制器。这两个控制器没有与 segue 连接。我附上了我的故事板的屏幕截图。我有一种感觉,我唯一的选择是使用单例,或者代表可以吗?不使用方法:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

我无法通过 segue 标识符访问 VC1。如果不访问标识符,这怎么可能?

请看一下图片,让我知道我有哪些选项以及在这里最好使用的选项。

【问题讨论】:

  • 如果你不想使用 Singleton,那么你可以使用 CoreData。 VC1 会将您正在处理的任何信息存储到 coreData 表中,然后 VC2 将在viewWillAppear 方法中检索它。另一个选择是 UserDefault... 最好的选择实际上取决于您要传递的数据
  • 如果视图控制器没有相互连接(或者即使它们相互连接),你应该真正考虑它们是否应该直接相互通信。尤其是在您传递数据的情况下,您应该使用某种与控制器分离的数据模型。

标签: ios swift


【解决方案1】:

如果您以编程方式导航到您的第二个 VC,您可以像这样设置值(第 3 行)

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController

newViewController.stringVariable = stringVariable

self.present(newViewController, animated: true, completion: nil)

【讨论】:

  • 这有一些限制,因为newViewController 与用户在导航层次结构中返回的UIViewController 实例不同。
【解决方案2】:

如果它是像字符串或变量这样的小数据,您可以使用 UserDefault 或使用类变量(如 vc2.data = data)传递数据 如何使用 UserDefaults How to use UserDefaults in swift?

如果它更像表或用户列表数量,您可以使用 plist 存储在您的包中,可以从任何视图控制器检索 使用 Plist How do I get a plist as a Dictionary in Swift?

如果两个控制器有某种联系,您可以使用委托。 代表们:- Delegates in swift?

如果您不确定数据何时可用/或基于某些操作发送,或在触发某些事件时发送,您也可以使用通知

使用通知How to pass data using NotificationCentre in swift 3.0 and NSNotificationCenter in swift 2.0?传递数据

【讨论】:

  • 谢谢。用户 UserDefaults 的问题是我需要先将该数据传递到第二个视图控制器,然后在第二个视图控制器中我希望数据与 UserDefaults 一起保存。否则第二个 VC 就没有意义了。 VC 的第二个功能是保存所有数据。
【解决方案3】:

一种方法是使用导航层次结构来访问视图控制器。

在您要传递数据的 viewController 中,tabBarController 属性应该与 VC2 所属的标签栏实例相同

func setStringForVC2(stringToSet:String) {
    guard let myTabBarController = tabBarController, let tabBarViewControllers = myTabBarController.viewControllers else {
        return
    }

    //need to access index 1 since vc's are stored in tabbarcontroller starting with 0, so 1 to access 2nd vc.
    if (tabBarViewControllers.indices.contains(1)) {
        if let vc2 = tabBarViewControllers[1] as? VC2Class {
            vc2.stringIWantToSet = stringToSet
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 2021-03-17
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多