为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

鸿蒙传说 2019-08-28 10:32:44
如何在Swift中的视图控制器之间传递数据?我尝试在加载视图时创建全局变量并更新信息但是没有呈现数据。全球变量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}
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

对于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 Foundationclass 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 Variablelet shareData = ShareData.sharedInstanceoverride func viewDidLoad() {
    self.shareData.someString ="Some String Value"}

而在我ViewControllerTwo,我可以访问someString

let shareData = ShareData.sharedInstanceoverride func viewDidLoad() {
    NSLog(self.sharedData.someString) // It will print Some String Value}


查看完整回答
反对 回复 2019-08-28
?
www说

TA贡献1775条经验 获得超8个赞

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

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

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

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

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


查看完整回答
反对 回复 2019-08-28
  • 3 回答
  • 0 关注
  • 626 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信