如何在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:
- 在ViewControllerA和ViewControllerB之间创build一个segue
- 在它的属性检查器中用一个标识符来命名segue
- 在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过,对我很有用。