Swift将数据从appDelegate传递到另一个类

问题描述 投票:14回答:2

我需要将一个变量从AppDelegate传递给另一个我创建的类来保存项目的全局变量,我无法找到使其工作的方法。

这是AppDelegate中的代码:

func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
    println("Device's token is: \(deviceToken)")

    //Global Variables Class Instance
    let globals:Globals = Globals()

    globals.setDeviceToken("test1") //method1 not working
    globals.deviceToken = "test2"   //method2 not working
}

这是我的Globals类:

public class Globals {
    var deviceToken = String()

    init() {
        //nothing
    }

    func setDeviceToken(s:String){
        deviceToken = s
    }

    func getDeviceToken() -> String {
        return deviceToken
    }
}

如果我尝试从项目的其他文件打印值,我将无法获得任何内容,只是一个空字符串。

class ViewController: UIViewController {

    //Global Variables Class Instance
    let globals:Globals = Globals()

    override func viewDidLoad() {
        println(globals.getDeviceToken())  //return empty string
        println(globals.deviceToken)       //return empty string
ios swift parameter-passing appdelegate
2个回答
15
投票

您可以使用几种模式来实现您想要的效果

  1. 您可以通过UIApplication访问AppDelegate: let delegate = UIApplication.sharedApplication().delegate as AppDelegate let deviceToken = delegate.deviceToken
  2. 看看单身人士。快速谷歌搜索'Swift singleton'将为您带来很长的路要走。第一个结果: class SingletonB { class var sharedInstance : SingletonB { struct Static { static let instance : SingletonB = SingletonB() } return Static.instance } }

然后使用sharedInstance在任何地方实例化单例并访问相同的变量。

第一个是快速和肮脏的,所以对于更严肃的项目,我会推荐单例模式。

可能有一百万种方法可以做到这一点,但这应该让你开始

(更多在此链接,探讨了实现单例的几种方法:https://github.com/hpique/SwiftSingleton


5
投票

我只是使用NSUserDefaults解决了我的问题

在AppDelegate中:

NSUserDefaults.standardUserDefaults().setObject(deviceToken, forKey: "deviceToken")
NSUserDefaults.standardUserDefaults().synchronize()

来自其他课程:

NSUserDefaults.standardUserDefaults().objectForKey("deviceToken")

老实说,我不知道这是否是一个很好的方法,但它是有效的

© www.soinside.com 2019 - 2024. All rights reserved.