2014-11-03 40 views
11

我需要将一个变量从AppDelegate传递到另一个类,这是我创建的用于保存项目的全局变量的类,我无法找到使其工作的方法。Swift将数据从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 

*** UPDATE: 对于那些谁否决了我的问题:非常感谢你。对不起,如果我不是Swift专家(尚未),并抱歉,如果我使用stackoverflow来问我不知道的东西!

+0

应用程序委托中应该保存多少数据?没有! EVER!不要这样做。这不是应用程序代表的用途。 – Fogmeister 2014-11-03 14:38:42

+6

有没有必要生气,我只是一个初学者,我正在努力学习。 @Fogmeister – MeV 2014-11-06 11:05:03

回答

14

有几种模式可以用来实现你想要

  1. 你可以通过UIApplication的访问的AppDelegate:

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let deviceToken = delegate.deviceToken 
    
  2. 查找到单身。快速谷歌搜索'斯威夫特单身'会让你走很长的路。第一个结果:

    class SingletonB { 
    
         class var sharedInstance : SingletonB { 
         struct Static { 
          static let instance : SingletonB = SingletonB() 
         } 
         return Static.instance 
        } 
    } 
    

然后使用sharedInstance随时随地实例化单和访问相同的变量。

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

大概有一百万的方式来做到这一点,但是这应该让你(在这个环节,它探索实行单身几种方法更多:https://github.com/hpique/SwiftSingleton)开始

+0

感谢您的回复。我从来没有使用过单身人士,需要阅读一些关于它的文档。但代码看起来与我用于Globals的代码非常相似。@Bob Vork – MeV 2014-11-03 14:53:02

+0

单身只是令人惊叹!!!!!谢谢!!!!!! @Bob Vork – MeV 2014-11-04 16:48:07

+0

正如链接文章所述,如果您使用的是Swift 1.2或更高版本,则不需要上述创建单例的复杂方法。 – RenniePet 2017-03-03 06:08:41

6

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

在AppDelegate中:

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

从其他类:

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

老实说,我不知道这是做一个很好的方式,但它的工作

***更新:对于那些谁否决了我的问题:非常感谢你。对不起,如果我不是Swift专家(尚未),并抱歉,如果我使用stackoverflow来问我不知道的东西!

+0

嗨!我想知道为什么不推荐使用NSUserDefaults? – mattyU 2015-08-17 21:06:14

+0

mattyU你需要问@Fogmeister在这里,因为他评论我的问题 – MeV 2015-08-18 17:09:46

相关问题