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

时间:2014-11-03 14:02:42

标签: ios swift parameter-passing appdelegate

我需要将一个变量从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
}

这是我的全球类:

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

2 个答案:

答案 0 :(得分:15)

您可以使用多种模式来实现您的目标

  1. 您可以通过UIApplication访问AppDelegate:

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate
    let deviceToken = delegate.deviceToken
    
  2. 看看单身人士。快速谷歌搜索Swift单身人士'会帮到你很长的路。第一个结果:

    class SingletonB {
    
            class var sharedInstance : SingletonB {
            struct Static {
                static let instance : SingletonB = SingletonB()
            }
            return Static.instance
        }
    }
    
  3. 然后使用sharedInstance在任何地方实例化单例并访问相同的变量。

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

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

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

答案 1 :(得分:5)

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

AppDelegate中的

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

来自其他课程:

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

老实说,我不知道这是否是一个很好的方法,但它正在运作