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

时间:2014-08-09 05:22:59

标签: ios swift

我尝试创建全局变量并在加载视图时更新信息,但数据未被渲染。

GLOBAL VARIABLES

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

除了拥有全局变量之外,是否有更有效的方式传递信息?

@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
}

4 个答案:

答案 0 :(得分: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...
    }
}

答案 1 :(得分:23)

适用于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版本

您可以使用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!
}

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

//Declare Class Variable

let shareData = ShareData.sharedInstance

override func viewDidLoad() {
    self.shareData.someString ="Some String Value"
}

在我的ViewControllerTwo我可以{/ 1}}访问

someString

答案 2 :(得分:4)

就个人而言,我更喜欢以下方式:

  • 如果你想在两个视图控制器之间(从A到B)跳转,如-pushViewController:animated:在导航中,你可以为Controller B定义一个模型的属性并公开它,然后设置它在从控制器A跳转之前显式的属性,它非常简单;

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

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

Apple在官方文档中有关于委托模式,通知模式的详细说明,请在XCode中查看,:)

答案 3 :(得分:1)

只需要遵循3个步骤,假设您要将数据从ViewControllerA传递到ViewControllerB:

  1. 在ViewControllerA和ViewControllerB之间创建一个segue
  2. 在其属性检查器中使用标识符命名segue
  3. 覆盖ViewControllerA的prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
  4. 对于第3步

    • 如果您不使用swift 2.1 ,请关注@Scott Mielcarski 's answer at this question
    • 对于使用 swift 2.1 的人,或者错误"无法转换类型的值' UIViewController'指定类型'您的视图控制器类名称',在关注@Scott Mielcarski 's answer at this question后,请使用let destinationVC:ViewControllerClass = segue.destinationViewController as! ViewControllerClass 而不是 let destinationVC:ViewControllerClass = segue.destinationViewController

      这是在Swift 2.1.1上测试的,它对我有用。