在没有segue的情况下在View Controllers之间传递数据

时间:2018-03-06 20:11:53

标签: ios swift

我的设计碰到了墙。我试图将字符串从一个View Controller传递给另一个。那两个控制器没有与segue连接。我附上了故事板的大纲。我有一种感觉,我唯一的选择是使用Singleton,还是代表可以使用?不使用方法:

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

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

请查看图片,让我知道我有哪些选项以及最适合使用的选项。

Storyboard design

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如果它是一个小数据,如某些字符串或变量,您可以使用 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?

传递数据

答案 2 :(得分:0)

一种方法是使用导航heiarchy来访问视图控制器。

从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
        }
    }
}