2015-04-02 17 views
9

Come passare i dati memorizzati in un'etichetta dal controller di interfaccia a un altro controller di interfaccia in WatchKit utilizzando Swift? Non riesco a trovare una risposta da nessuna parte, spero che qualcuno qui possa aiutarmi. Ho incluso la sezione del mio codice che si occupa del calcolo del valore che ho bisogno di passare. Fondamentalmente voglio mostrare lo stesso valore che è stato calcolato dall'utente ed elaborarlo di più nel prossimo Controller di interfaccia chiamato ResultsController. Qualsiasi aiuto è molto apprezzato: DPassaggio di dati tra controller di interfaccia in WatchKit

class InterfaceController: WKInterfaceController { 
    var currentValue: String = "0" 

    func setDisplayValue(value: Double) 
    { 
     var percent = value 
     // check if value is an integer 
     if value % 1 == 0 
     { 
      // our value is an integer 
      currentValue = "\(Int(value))"// new value % 
     } 
     else 
     { 
      // our value is a float 
      currentValue = "\(value)" 
     } 
     // Display 2 decimal places in final amount 
     var round = NSString(format:"%.2f", value) 
     displayLabel.setText("$\(round)") // Display final value 
     // This value is what I want to be passed to another label in another IC. 
    } 

    // Answer Tapped 
    @IBAction func totalTapped() { 
     if command != nil 
     { 
      let answer = command!.executeWithNewValue((currentValue as NSString).doubleValue) 
      setDisplayValue(answer) 
      command = nil 
      calculationExecuted = true 
     } 
    } 
} 

Questo è il secondo controllore di interfaccia che voglio il valore dal primo ad essere visualizzato utilizzando un'etichetta.

import WatchKit 
import Foundation 


class ResultsController: WKInterfaceController { 

    @IBOutlet weak var totalLabel: WKInterfaceLabel! 

    override func awakeWithContext(context: AnyObject?) { 
     super.awakeWithContext(context) 

     // Label to hold the same value as in previous Interface Controller 
     totalLabel.setText("") 
    } 

    override func willActivate() { 
     // This method is called when watch view controller is about to be visible to user 
     super.willActivate() 
    } 

    override func didDeactivate() { 
     // This method is called when watch view controller is no longer visible 
     super.didDeactivate() 
    } 

} 

Modifica: ecco il tutorial che ho seguito, l'ho manipolato un po 'per essere essenzialmente un suggerimento. Ho aggiunto in ResultsController per contenere le informazioni immesse dall'utente utilizzando la calcolatrice da InterfaceController ma non riesco a passare i dati sulle mie etichette in RC, nel comando I rimosso sottrarre e dividere in quanto non avrei bisogno di quelle . Quindi gli unici pulsanti di calcolo che ho sono multipli e addizionali. Esempio di come dovrebbe funzionare: Inserisci per un importo 12.58rubinetto si moltiplicano e entrare in 15rubinetto aggiungere e visualizza la quantità finale di 14,46 ho bisogno di passare su tutti quei valori di RC in etichette separate.

Github Tutorial - Apple Watch

Qui è quello che sto cercando di realizzare: Passando il valore iniziale ad un'etichetta, e la quantità di punta, così come il costo finale per separare le etichette per assomigliare ad un disegno di legge.

risposta

15

Il modo migliore per eseguire questa operazione è sovrascrivere il metodo contextForSegueWithIdentifier che viene chiamato quando si passa da una vista alla successiva.

Il metodo di trasmissione dei dati tra WKInterfaceController s è leggermente diverso dal metodo per farlo con UIViewController s in un'app iOS tradizionale.

Normalmente, si farebbe qualcosa di simile:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     let controller: DetailViewController = (segue.destinationViewController as UINavigationController).topViewController as DetailViewController 
     controller.myVariable = myValue 
    } 
} 

Tuttavia, non v'è alcuna prepareForSegue metodo WatchKit. Il metodo contextForSegueWithIdentifierWKInterfaceController è simile a, ma presenta una differenza evidente: non fornisce un'istanza del controller di visualizzazione di destinazione.

Invece, si restituiscono i dati dal metodo e si accede a tali dati all'interno della classe di destinazione.

Quindi, nel tuo caso, sarebbe simile a questa:

// In InterfaceController 
override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? { 
    // You may want to set the context's identifier in Interface Builder and check it here to make sure you're returning data at the proper times 

    // Return data to be accessed in ResultsController 
    return self.currentValue 
} 

// In ResultsController 
override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 

    // Make sure data was passed properly and update the label accordingly 
    if let val: String = context as? String { 
     self.totalLabel.setText(val) 
    } else { 
     self.totalLabel.setText("") 
    } 
} 
+0

Grazie per la risposta, AstroCB, la mia app è fondamentalmente una calcolatrice, quindi CurrentValue è in continua evoluzione, che il codice precedente che hai postato mostrava solo l'ultimo valore inserito dall'utente. Come potrei salvare il primo valore inserito e passare a un'etichetta ResultsController e anche passare il valore aggiunto, mult, div o sottratto a un'etichetta diversa in ResultsController e infine passare la "risposta" a un'etichetta diversa ? Ci scusiamo per tutte le domande lol – adrlan

+1

@adrlan Non c'è problema; se vuoi passare più valori, puoi restituire un dizionario, come questo 'var dict: [String: Int] = [" added ": addedVal," sottratto ": subtrVal]' (ecc.) e quindi puoi accedervi in Risultati come questo: 'if let dict: [String: Int] = context as? [String: Int] {let added: Int = dict ["added"]} '. – AstroCB

+0

E il contrario? Da 'ResultsController' a' InterfaceController' – Nico

10

Usa pushControllerWithName:context: o presentControllerWithName:context:

NSDictionary *exampleObj = @{@"key":@"value"}; 
[self pushControllerWithName:@"YourInterfaceControllerName" context:exampleObj]; 

Sul lato ricevente, utilizzare awakeWithContext:context

- (void)awakeWithContext:(id)context 
{ 
    [super awakeWithContext:context]; 
    NSString *value = context[@"key"]; 
} 

Come context è un (id), si ca n passare nulla, non solo NSDictionary.

+0

Questo down è stato votato perché non funziona o perché è una cattiva pratica? – Eagle11

+0

Mi piace questo metodo. Facile e semplice contesto è il tipo di id, quindi puoi passare qualsiasi cosa lì dentro. Bello! – GeneCode

+0

come accedere a quel "contesto" sul prossimo controller di interfaccia? –

Problemi correlati