2014-11-03 42 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

相關問題