我尝试在加载视图时创建全局变量并更新信息但是没有呈现数据.
全球变量
var viewName:String = ""
var viewDuration:String = ""
var viewPeriod:String = ""
var viewMinAmp:String = ""
var viewMaxAmp:String = ""
var viewStep:String = ""
var viewType:String = ""
Run Code Online (Sandbox Code Playgroud)
除了拥有全局变量之外,是否有更有效的方式传递信息?
@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
}
Run Code Online (Sandbox Code Playgroud)
Sco*_*ski 34
一种解决方案是从视图控制器中覆盖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...
}
}
Run Code Online (Sandbox Code Playgroud)
Saq*_*mer 23
对于Swift 3.0
final class Shared {
static let shared = Shared() //lazy init, and it only runs once
var stringValue : String!
var boolValue : Bool!
}
Run Code Online (Sandbox Code Playgroud)
设置 stringValue
Shared.shared.stringValue = "Hi there"
Run Code Online (Sandbox Code Playgroud)
要得到 stringValue
if let value = Shared.shared.stringValue {
print(value)
}
Run Code Online (Sandbox Code Playgroud)
适用于低于3.0的Swift版本
您可以使用singleton类在视图之间传递数据.这是简单而有效的方式.这是我的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!
}
Run Code Online (Sandbox Code Playgroud)
现在ViewControllerOne
我可以设置上面的变量.
//Declare Class Variable
let shareData = ShareData.sharedInstance
override func viewDidLoad() {
self.shareData.someString ="Some String Value"
}
Run Code Online (Sandbox Code Playgroud)
而在我ViewControllerTwo
,我可以访问someString
如
let shareData = ShareData.sharedInstance
override func viewDidLoad() {
NSLog(self.sharedData.someString) // It will print Some String Value
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我更喜欢以下方式:
如果你想在两个视图控制器之间跳转(从 A 到 B),如 -pushViewController:animated: 在导航中,你可以为控制器 B 定义一个模型的属性并公开它,然后在从控制器跳转之前显式设置这个属性A,这很简单;
如果您想从控制器 B 向后跳转到 A,请使用 Delegate+Protocol 模式。控制器 B 起草公共协议并拥有“委托”属性,任何想成为控制器 B 的委托的对象都应遵守并实施其协议(可选)。然后在向后跳转之前,控制器 B 使其委托执行协议中列出的某些操作,数据可以通过这种方式传输;
在某些情况下,您可能希望将数据从一个控制器(或多个控制器)传输到其他多个控制器,如果是这种情况,请使用通知机制。
Apple 在官方文档中有关于委托模式、通知模式的详细说明,请在 XCode 中查看,:)