从appDelegate传递数据到另一个类的Swift方法

15

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

应该在应用程序委托中保存多少数据?没有!永远不要这样做。这不是应用程序委托的作用。 - Fogmeister
10
没必要生气,我只是个新手,正在努力学习。@Fogmeister - MeV
2个回答

15

有几种模式可用于实现您想要的效果。

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

  2. let delegate = UIApplication.sharedApplication().delegate as AppDelegate
    let deviceToken = delegate.deviceToken
    
  3. 了解单例模式。快速搜索“Swift singleton”可以帮你很多。第一个结果:

    class SingletonB {
    
            class var sharedInstance : SingletonB {
            struct Static {
                static let instance : SingletonB = SingletonB()
            }
            return Static.instance
        }
    }
    
    然后使用sharedInstance在任何地方实例化该单例并访问相同的变量。
    第一种方法快速而不够严谨,因此对于更重要的项目,我建议使用单例模式。
    可能有一百万种方法来实现这一点,但这应该可以帮助您入门。
    (更多内容请参见此链接,其中探讨了几种实现单例模式的方法:https://github.com/hpique/SwiftSingleton

感谢您的回复。我从未使用过单例模式并需要阅读一些相关文档。但是这段代码看起来非常类似于我用于全局变量的代码。@Bob Vork - MeV
正如链接文章所记录的那样,如果您使用的是Swift 1.2或更高版本,则不需要上述相当复杂的创建单例的方式。 - RenniePet

5

我通过使用NSUserDefaults简单地解决了我的问题。

在AppDelegate中:

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

来自其他类:

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

老实说,我不知道这是否是一个好的做法,但它是可行的。

嗨!我想知道为什么不建议使用NSUserDefaults? - Matthew Usdin
mattyU,你需要问问这里的@Fogmeister,因为他评论了我的问题。 - MeV
1
NSUserdefaults需要时间来存储数据,而且如果不小心的话,你不能存储任何类型的数据。NSUserdefaults应该只用于在会话之间保存数据。 - Rickard Elimää

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接