web-dev-qa-db-ja.com

Swift 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
14
MeV

あなたが望むものを達成するために使用できるいくつかのパターンがあります

  1. UIApplicationを介してAppDelegateにアクセスできます。

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate
    let deviceToken = delegate.deviceToken
    
  2. シングルトンを調べてください。 「Swiftsingleton」をグーグルですばやく検索すると、長い道のりがわかります。最初の結果:

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

次に、sharedInstanceを使用してシングルトンを任意の場所にインスタンス化し、同じ変数にアクセスします。

最初のものは速くて汚いので、より深刻なプロジェクトにはシングルトンパターンをお勧めします。

これを行うにはおそらく百万の方法がありますが、これで始めることができます

(シングルトンを実装するいくつかの方法を探るこのリンクで詳細をご覧ください: https://github.com/hpique/SwiftSingleton

15
Bob Vork

NSUserDefaultsを使用して問題を簡単に解決しました

appDelegate内:

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

他のクラスから:

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

正直なところ、これが良い方法かどうかはわかりませんが、うまくいきます。

5
MeV