如何在Swift中的视图控制器之间传递数据?

我试图创build全局variables和更新信息,当视图加载但数据不呈现。

全球变数

var viewName:String = "" var viewDuration:String = "" var viewPeriod:String = "" var viewMinAmp:String = "" var viewMaxAmp:String = "" var viewStep:String = "" var viewType:String = "" 

除了拥有全局variables之外,还有更有效的方式传递信息吗?

 @IBOutlet var txtName: UITextField! @IBOutlet var txtDuration: UITextField! @IBOutlet var txtPeriod: UITextField! @IBOutlet var txtMinAmp: UITextField! @IBOutlet var txtMaxAmp: UITextField! @IBOutlet var txtStep: UITextField! @IBOutlet var txtType: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. setInfo(viewName, duration: viewDuration, period: viewPeriod, minAmp: viewMinAmp, maxAmp: viewMaxAmp, step: viewStep, type: viewType) } func setInfo(name: String, duration: String, period: String, minAmp: String, maxAmp: String, step: String, type: String) { txtName.text = name txtDuration.text = duration txtPeriod.text = period txtMinAmp.text = minAmp txtMaxAmp.text = maxAmp txtStep.text = step txtType.text = type } 

一种解决scheme是从视图控制器中覆盖prepareForSegue(segue:sender :),其中包含您希望传递到目标视图控制器的数据。

 override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == "YourSegueName") { //get a reference to the destination view controller let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass //set properties on the destination view controller destinationVC.name = viewName //etc... } } 

对于Swift 3.0

 final class Shared { static let shared = Shared() //lazy init, and it only runs once var stringValue : String! var boolValue : Bool! } 

设置stringValue

 Shared.shared.stringValue = "Hi there" 

得到stringValue

  if let value = Shared.shared.stringValue { print(value) } 

对于3.0以下的Swift版本

您可以使用单例类在视图之间传递数据。 这是简单而有效的方式。 这是我的课ShareData.swift

 import Foundation class ShareData { class var sharedInstance: ShareData { struct Static { static var instance: ShareData? static var token: dispatch_once_t = 0 } dispatch_once(&Static.token) { Static.instance = ShareData() } return Static.instance! } var someString : String! //Some String var selectedTheme : AnyObject! //Some Object var someBoolValue : Bool! } 

现在在我的ViewControllerOne我可以设置上面的variables。

 //Declare Class Variable let shareData = ShareData.sharedInstance override func viewDidLoad() { self.shareData.someString ="Some String Value" } 

而在我的ViewControllerTwo我可以访问someString

 let shareData = ShareData.sharedInstance override func viewDidLoad() { NSLog(self.sharedData.someString) // It will print Some String Value } 

我个人更喜欢以下方法:

  • 如果要在两个视图控制器之间跳转(从A到B),请在导航中使用-pushViewController:animated:您可以为控制器B定义模型的属性并公开显示它,然后在从控制器A,非常简单;

  • 如果你想从控制器B跳回到A,使用委托+协议模式。 控制器B起草一个公共协议并拥有一个“委托”属性,任何想要成为控制器B委托的对象都应该遵守和执行其协议(可选)。 然后在跳转之前,控制器B使其委托执行协议中列出的某些动作,数据可以这样传输;

  • 在某些情况下,您可能希望将数据从控制器(或控制器)传输到其他多个控制器,如果是这种情况,请使用通知机制。

苹果有关于委托模式的详细说明,官方文档中的通知模式,在XCode中检查出来:)

只需要遵循3个步骤,让我们假设你想从ViewControllerA传递数据到ViewControllerB:

  1. 在ViewControllerA和ViewControllerB之间创build一个segue
  2. 在它的属性检查器中用一个标识符来命名segue
  3. 在ViewControllerA覆盖prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)

对于步骤#3 ,:

  • 如果你没有使用swift 2.1 ,请在这个问题上关注@Scott Mielcarski的回答
  • 对于使用swift 2.1或者出现错误的用户, “无法将types为'UIViewController'的值转换为指定的types'您的视图控制器类名称', 在此问题后面的@Scott Mielcarski的答案后 , 请使用let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass 而不是 let destinationVC:ViewControllerClass = segue.destinationViewController

    这在Swift 2.1.1上testing过,对我很有用。