我的设计碰到了墙。我试图将字符串从一个View Controller传递给另一个。那两个控制器没有与segue连接。我附上了故事板的大纲。我有一种感觉,我唯一的选择是使用Singleton,还是代表可以使用?不使用方法:
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
我无法通过segue标识符访问VC1。如果不访问标识符,怎么可能呢?
请查看图片,让我知道我有哪些选项以及最适合使用的选项。
答案 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
}
}
}