2014-11-03 19 views
11

Devo passare una variabile dall'AppDelegate a un'altra classe che ho creato per contenere le variabili globali del progetto e non sono in grado di trovare un modo per farlo funzionare.Rapido Passaggio dei dati da appDelegate a un'altra classe

Questo è il codice che 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 
} 

Questa è la mia classe Globals:

public class Globals { 
    var deviceToken = String() 

    init() { 
     //nothing 
    } 

    func setDeviceToken(s:String){ 
     deviceToken = s 
    } 

    func getDeviceToken() -> String { 
     return deviceToken 
    } 
} 

se provo a stampare il valore, da altri file del progetto, sono non è in grado di ottenere nulla, solo una stringa vuota.

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 

*** AGGIORNAMENTO: A coloro che hanno votato la mia domanda: Grazie mille. Scusa se non sono un esperto di Swift (ancora) e scusa se sto usando StackOverflow per chiedere qualcosa che non conosco!

+0

Quanti dati devono essere conservati nel delegato dell'app? NESSUNA! MAI! Non farlo Non è ciò per cui è delegato l'app. – Fogmeister

+6

Non c'è bisogno di arrabbiarsi, sono solo un principiante e sto cercando di imparare. @Fogmeister – MeV

risposta

14

Sono disponibili diversi modelli che è possibile utilizzare per ottenere ciò che si vuole

  1. Si potrebbe accedere al AppDelegate attraverso l'UIApplication:

    let delegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let deviceToken = delegate.deviceToken 
    
  2. sguardo nel single. Una rapida ricerca su google per "Swift singleton" ti farà guadagnare molto. Il primo risultato:

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

Quindi utilizzare sharedInstance per istanziare il singleton ovunque e accedere alle stesse variabili.

Il primo è veloce e sporco, quindi per i progetti più seri raccomanderei il modello singleton.

Probabilmente ci sono un milione di modi per farlo, ma questo dovrebbe iniziare

(Altro a questo link, che esplora alcuni modi per implementare single: https://github.com/hpique/SwiftSingleton)

+0

Grazie per la risposta. Non ho mai usato singleton e ho bisogno di leggere qualche documentazione a riguardo. Ma il codice sembra molto simile a quello che stavo usando per [email protected] Vork – MeV

+0

singleton sono semplicemente INCREDIBILI !!!!! GRAZIE!!!!!! @Bob Vork – MeV

+0

Come documentato nell'articolo linkato, il metodo piuttosto complicato di creare un singleton non è necessario se si utilizza Swift 1.2 o versioni successive. – RenniePet

6

ho semplicemente risolto il mio problema utilizzando NSUserDefaults

nella AppDelegate:

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

Da un altro classi:

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

Onestamente non so se questo è un buon modo per farlo, ma che sta funzionando

*** AGGIORNAMENTO: Per coloro che hanno votato la mia domanda: Thank you very much. Scusa se non sono un esperto di Swift (ancora) e scusa se sto usando StackOverflow per chiedere qualcosa che non conosco!

+0

ciao! Mi piacerebbe sapere perché non si consiglia di utilizzare NSUserDefaults? – mattyU

+0

mattyU devi chiedere a @Fogmeister quassù, perché ha commentato la mia domanda – MeV

Problemi correlati