Swift:在视图之间传递多个值

Posted

技术标签:

【中文标题】Swift:在视图之间传递多个值【英文标题】:Swift: Pass multiple values between views 【发布时间】:2015-02-03 17:08:04 【问题描述】:

我有一个包含两个文本字段和一个按钮的视图。

@IBOutlet var inputURL: UITextField!
@IBOutlet var inputName: UITextField!

@IBAction func submitUrlButton(sender: AnyObject) 

第二个视图有两个变量:

var submittedURL = ""
var submittedName = ""

println("Name \(submittedName)")
println("URL \(submittedURL)")

在 Swift 中,如何传递在两个文本字段中输入的值并将它们分配给第二个视图中的这些变量?

谢谢

为 THETOM 编辑:

import UIKit

class ViewController: UIViewController 

@IBOutlet var inputURL: UITextField!

@IBAction func submitBtn(sender: AnyObject) 
    performSegueWithIdentifier("submissionSegue", sender: self)



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 

    // Create a new variable to store the instance of the next view controller
    let destinationVC = segue.destinationViewController as BrandsViewController
    destinationVC.submittedURL.text = inputURL.text


【问题讨论】:

您能否详细说明以下几点: - 那些视图或视图控制器? - 谁在创建这些视图或视图控制器? - 这两个视图之间有联系吗? @TheTom 是的,他们是视图控制器,他们有一个名为“submissionSegue”的segue。 【参考方案1】:

你可以使用方法prepareForSegue。

在第一个视图(segue 的来源)中编写以下代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 

    // Create a new variable to store the instance of the next view controller 
    let destinationVC = segue.destinationViewController as CustomViewController
    destinationVC.submittedURL = inputURL.text
    destinationVC.submittedName = inputName.text

这里的CustomViewController是segue要去的UIViewController的自定义类。

要在您的按钮@IBAction 中以编程方式执行转场:

@IBAction func buttonWasClicked(sender: AnyObject) 
    performSegueWithIdentifier("submissionSegue", sender: self)

【讨论】:

那我如何获得启动segue更改的按钮? 另外,当我将该代码添加到视图控制器中时,我得到:使用未声明的类型'UIViewController' 执行 segue 将其添加到 IBAction : performSegueWithIdentifier("submissionSegue", sender: self) 检查 UIViewController 是否拼写正确。我之前打错字了。否则在文件开头导入 UIKit @TheTom UIViewController 没有成员 submitURL 或 submitName 因此它应该被转换为扩展 UIViewController 的对象【参考方案2】:

由于您的视图控制器与 segue 链接,您可以在第一个视图控制器中覆盖 prepareForSegue 方法并通过这样做来传递数据

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

    if (segue.identifier == "secondViewController")  // here secondViewController is your segue identifier            
        var secondViewController = segue.destinationViewController as SecondViewController // where SecondViewController is the name of your second view controller class
        secondViewController.submittedURL = inputURL.text
        secondViewController.submittedName = inputName.text
    

要在按钮操作中执行Segue,请使用 perfromSegueWithIdentifier 方法

@IBAction func submitUrlButton(sender: AnyObject) 

    //replace identifier with your identifier from storyboard
    self.performSegueWithIdentifier("secondViewController", sender: self)

【讨论】:

【参考方案3】:
The simplest way of accessing values globally not neccessary to pass with segue

第一个视图控制器

import UIKit
var submittedURL:NSString? // declare them here
var submittedName:NSString? // Now these two variables are accessible globally 
class YourViewController : UIViewController 

@IBOutlet var inputURL: UITextField!
@IBOutlet var inputName: UITextField!

@IBAction func submitUrlButton(sender: AnyObject) 
 if inputURL.text == "" && inputName.text == ""
 
 //Show an alert here etc

else 
 self.submittedURL.text = inputURL.text
self.submittedName.text = inputName.text
 


SecondView 控制器

import UIKit
class SecondviewController: UIViewController 

//inside viewDidload
println(submittedURL)
println(submittedName)

【讨论】:

以上是关于Swift:在视图之间传递多个值的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中的 ONE ViewController 中的视图之间传递数据

Swift - 在视图控制器之间传递数据

在具有委托的视图控制器之间传递多个值

如何在 Swift 中的视图之间传递数据

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

prepareForSegue 是在视图控制器之间传递值的正确方法吗