将 segue 上的数据传递给视图控制器 (Swift)
Passing data on segue to view controller (Swift)
我想将数据传递给名为 "addParty" 的视图控制器。为了说明这一点,我的应用程序从 A -> B -> C -> D 开始。A 到 C 是接收用户信息的设置页面。这些页面后跟 D,它是 "addParty",我希望从 A 到 C 的所有数据都在这里传递。
下面是我迄今为止使用视图控制器 A 到 C 所做的示例。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "Setup1Segue") {
var DestViewController: addToParty = segue.destinationViewController as! addToParty
// path the cell's content to your detailViewController
DestViewController.PartyName = etPartyName.text!
DestViewController.Address = etAddress.text!
DestViewController.City = etCity.text!
DestViewController.State = etState.text!
DestViewController.Zip = etZip.text!
}
}
您需要覆盖 ViewController 中的“prepareForSegue”方法。
在您的 FirstViewController.swift 中定义了要显示第二个的任何动作ViewController 并且在这个 ViewController (SecondViewControler.swift) 中您需要声明您将收到的变量 FirstViewController.swift
FirstViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "btnSubmitSencondViewController") {
var svc = segue.destinationViewController as SecondViewController;
svc.dataPassed = fieldA.text
svc.secondDataPassed = fieldB.text
}
}
终于!在我们的第二个视图控制器 class 文件 (SecondViewController.swift) 中,我们需要在调用 viewDidLoad 时将变量分配给显示标签。这很简单,只需查找 override func viewDidLoad() 并输入下面的代码。
labelA.text = dataPassed
labelB.text = secondDataPassed
您可以使用所有视图控制器通用的 class,并将您的详细信息保存到这个通用的 class 变量中。
首先创建一个名为 PartyDetails
的新 swift 文件
import Foundation
class PartyDetails {
class var sharedInstance: PartyDetails {
struct Static {
static var instance: PartyDetails?
static var token: dispatch_once_t = 0
}
dispatch_once(&Static.token) {
Static.instance = PartyDetails()
}
return Static.instance!
}
var partyName: String?
var address: String?
var city: String?
var state: String?
var zip: Int?
}
然后在 ViewControllers A,B,C 中放入这段代码
例如:-
class A: UIViewController{
let partyInfo = PartyDetails.sharedInstance
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Setup1Segue" {
let jobDetailViewController = segue.destinationViewController as! B
self.partyInfo.partyName = label1.text // save your info
self.partyInfo.address = label2.text // save your info
}
}
}
}
然后在classD中这样使用,
class D: UIViewController {
var partyInfo = PartyDetails.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
myLabel1.text = self.partyInfo.partyName
myLabel2.text = self.partyInfo.address
}
}
如果信息非常重要并且您需要确保它可以在整个应用程序中访问,您可以将变量放在应用程序委托中
首先,像这样
定制class
import Foundation
class PartyDetails: NSObject
{
var partyName: String? = nil
var address: String? = nil
var city: String? = nil
var state: String? = nil
var zip: Int? = nil
}
现在在您的应用委托中声明一个变量
var partyDetails: PartyDetails! = nil
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
// Override point for customization after application launch.
loadPartyDetailsOrInitializeHere()
return true
}
现在您可以通过使用以下代码引用它来访问视图控制器中任何位置的同一个 partyDetails 对象
var partyDetails = (UIApplication.sharedApplication().delegate as! YOUR_APP_DELEGATE_CLASS_HERE).partyDetails
您必须将 YOUR_APP_DELEGATE_CLASS_HERE 替换为您的代表 class 是什么。
这种方法比通过 segue 的变化传递对象要好。
其实我经常这样做,而且效果很好。
我想将数据传递给名为 "addParty" 的视图控制器。为了说明这一点,我的应用程序从 A -> B -> C -> D 开始。A 到 C 是接收用户信息的设置页面。这些页面后跟 D,它是 "addParty",我希望从 A 到 C 的所有数据都在这里传递。
下面是我迄今为止使用视图控制器 A 到 C 所做的示例。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
if (segue.identifier == "Setup1Segue") {
var DestViewController: addToParty = segue.destinationViewController as! addToParty
// path the cell's content to your detailViewController
DestViewController.PartyName = etPartyName.text!
DestViewController.Address = etAddress.text!
DestViewController.City = etCity.text!
DestViewController.State = etState.text!
DestViewController.Zip = etZip.text!
}
}
您需要覆盖 ViewController 中的“prepareForSegue”方法。
在您的 FirstViewController.swift 中定义了要显示第二个的任何动作ViewController 并且在这个 ViewController (SecondViewControler.swift) 中您需要声明您将收到的变量 FirstViewController.swift
FirstViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "btnSubmitSencondViewController") {
var svc = segue.destinationViewController as SecondViewController;
svc.dataPassed = fieldA.text
svc.secondDataPassed = fieldB.text
}
}
终于!在我们的第二个视图控制器 class 文件 (SecondViewController.swift) 中,我们需要在调用 viewDidLoad 时将变量分配给显示标签。这很简单,只需查找 override func viewDidLoad() 并输入下面的代码。
labelA.text = dataPassed
labelB.text = secondDataPassed
您可以使用所有视图控制器通用的 class,并将您的详细信息保存到这个通用的 class 变量中。
首先创建一个名为 PartyDetails
的新 swift 文件import Foundation class PartyDetails { class var sharedInstance: PartyDetails { struct Static { static var instance: PartyDetails? static var token: dispatch_once_t = 0 } dispatch_once(&Static.token) { Static.instance = PartyDetails() } return Static.instance! } var partyName: String? var address: String? var city: String? var state: String? var zip: Int?
}
然后在 ViewControllers A,B,C 中放入这段代码
例如:-
class A: UIViewController{
let partyInfo = PartyDetails.sharedInstance
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Setup1Segue" {
let jobDetailViewController = segue.destinationViewController as! B
self.partyInfo.partyName = label1.text // save your info
self.partyInfo.address = label2.text // save your info
}
}
}
}
然后在classD中这样使用,
class D: UIViewController { var partyInfo = PartyDetails.sharedInstance override func viewDidLoad() { super.viewDidLoad() myLabel1.text = self.partyInfo.partyName myLabel2.text = self.partyInfo.address } }
如果信息非常重要并且您需要确保它可以在整个应用程序中访问,您可以将变量放在应用程序委托中
首先,像这样
定制classimport Foundation
class PartyDetails: NSObject
{
var partyName: String? = nil
var address: String? = nil
var city: String? = nil
var state: String? = nil
var zip: Int? = nil
}
现在在您的应用委托中声明一个变量
var partyDetails: PartyDetails! = nil
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
// Override point for customization after application launch.
loadPartyDetailsOrInitializeHere()
return true
}
现在您可以通过使用以下代码引用它来访问视图控制器中任何位置的同一个 partyDetails 对象
var partyDetails = (UIApplication.sharedApplication().delegate as! YOUR_APP_DELEGATE_CLASS_HERE).partyDetails
您必须将 YOUR_APP_DELEGATE_CLASS_HERE 替换为您的代表 class 是什么。
这种方法比通过 segue 的变化传递对象要好。 其实我经常这样做,而且效果很好。