2015-10-26 3 views
2

У меня возникло множество проблем с попыткой получить пару переменных с одного контроллера просмотра на другой. Как я могу сделать это правильно? Вот мой код ниже. Это диспетчер представлений, в котором я хочу отправить переменные RedScoreW и BlueScoreW в следующее окно. Я спрашиваю, КАК ДЕЛАТЬ ЭТО, используя язык SWIFT и специально для приложений WATCHOS.Как передать переменные из одного контроллера просмотра в другой в WatchOS 2 и Swift

class InterfaceController2: WKInterfaceController { 

    var RedScoreW = 0 
    var BlueScoreW = 0 


    @IBOutlet var WatchRedScoreLabel: WKInterfaceLabel! 
    @IBOutlet var WatchBlueScoreLabel: WKInterfaceLabel! 

    @IBAction func RedScorePlus() { 
     if RedScoreW == 999 { 
      RedScoreW = 0 
      WatchRedScoreLabel.setText("0") 
     }else { 
      RedScoreW += 1 
      WatchRedScoreLabel.setText(String(RedScoreW)) 
     } 
    } 
    @IBAction func RedScoreMinus() { 
     if RedScoreW == 0 { 
      RedScoreW = 999 
      WatchRedScoreLabel.setText("999") 
     } 
     else { 
     RedScoreW -= 1 
     WatchRedScoreLabel.setText(String(RedScoreW)) 
     } 
    } 

    @IBAction func BlueScorePlus() { 
     if BlueScoreW == 999 { 
      BlueScoreW = 0 
      WatchBlueScoreLabel.setText("0") 
     } else{ 
     BlueScoreW += 1 
     WatchBlueScoreLabel.setText(String(BlueScoreW)) 
     } 
    } 

    @IBAction func BlueScoreMinus() { 
     if BlueScoreW == 0 { 
      BlueScoreW = 999 
      WatchBlueScoreLabel.setText("999") 
     } 
     else { 
      BlueScoreW -= 1 
      WatchBlueScoreLabel.setText(String(BlueScoreW)) 
     } 
    } 

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

     WatchRedScoreLabel.setText(String(RedScoreW)) 
     WatchBlueScoreLabel.setText(String(BlueScoreW)) 


     // Configure interface objects here. 
    } 

    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() 
    } 


} 

И это Destination View Controller, где я хочу, чтобы иметь возможность использовать RedScoreW и BlueScoreW переменные.

class InterfaceController3: WKInterfaceController { 


    @IBOutlet var finalRedScoreLabel: WKInterfaceLabel! 

    @IBOutlet var finalBlueScoreLabel: WKInterfaceLabel! 

    @IBAction func DoneAndResetButton() { 
     self.popToRootController() 
    } 

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


     // Configure interface objects here. 
    } 

    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() 
    } 

} 

* EDIT *

Я пытаюсь сделать это таким образом, это код, где я отправить его, проверьте:

@IBAction func FinishButtonPushVariables() { 

     arrayofScores[0] = RedScoreW 
     arrayofScores[1] = BlueScoreW 

     pushControllerWithName("LastScreen", context: arrayofScores) 

    } 

И это, где я получаю его ... и это не сработает. LOL

@IBOutlet var finalRedScoreLabel: WKInterfaceLabel! 

    @IBOutlet var finalBlueScoreLabel: WKInterfaceLabel! 

    @IBAction func DoneAndResetButton() { 
     self.popToRootController() 
    } 


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

     let finalarrayofScores = context as? InterfaceController2 

     finalBlueScoreLabel.setText(String(finalarrayofScores!.arrayofScores[1])) 
     finalRedScoreLabel.setText(String(finalarrayofScores!.arrayofScores[0])) 



     // Configure interface objects here. 
    } 
+0

Возможный дубликат [Передача данных между контроллерами View] (http://stackoverflow.com/questions/5210535/passing-data-between-view- контроллеры) – trojanfoe

+0

Совсем нет. Ссылка, которую вы предоставляете, предназначена для Objective C и iOS, я спрашиваю о WatchOS и Swift 2. Спасибо! –

+0

Есть ли какая-то разница? – trojanfoe

ответ

3

В IOS приложений мы используем prepareForSegue, чтобы сделать это. В приложениях watchOS мы используем contextForSegueWithIdentifier для передачи контекста с одного интерфейса ControlController на другой.

Вот ссылка на class reference, которая подробно расскажет об этом. Но вот основные сведения:

Существует два разных метода, которые можно использовать. Одним из них является для перехода с одного контроллера интерфейса к другому:

func contextForSegueWithIdentifier(_ segueIdentifier: String) -> AnyObject?

Другой для перехода от контроллера одного интерфейса к другому , когда строка в таблице сливают:

func contextForSegueWithIdentifier(_ segueIdentifier: String, inTable table: WKInterfaceTable, rowIndex rowIndex: Int) -> AnyObject?

Таким образом, один из этих двух методов будет проходить в интерфейсе Controller, который отправляет контекст, и вы получите этот контекст в методе получающего интерфейсаController awakeWithContext.

Вот link к учебнику, в котором будет показано применение этого процесса.

EDIT

Вот конкретное решение вашей проблемы.

В интерфейсе управления, где вы посылаете его, поместите этот код:

override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? { 
    arrayofScores[0] = RedScoreW 
    arrayofScores[1] = BlueScoreW 
    return arrayOfScores 
} 

Затем в контроллер интерфейса назначения, поместите этот код:

override func awakeWithContext(context: AnyObject?) { 
    super.awakeWithContext(context) 
    let finalArrayOfScores = context as? [Int] 

    if let f = finalArrayOfScores { 
     finalBlueScoreLabel.setText(String(f[1])) 
     finalRedScoreLabel.setText(String(f[0])) 
    } 

} 
+0

Thank вы очень сильно !! Это действительно решило мою проблему, и вы помогли мне научиться использовать функцию contextForSegue. Еще раз спасибо. –

+0

Нет проблем, я рад, что это помогло! –

2

Вам необходимо настроить переменные, чтобы сначала сохранить свою переменную.

class YourSecondViewController: UIViewController { 
    var yourVariable:Double? 
} 

После этого ваша кнопка запускает ваш пользовательский сегмент. Используйте переменную в качестве аргумента для отправителя.

class YourFirstViewController: UIViewController { 
    @IBAction func buttonTapped(sender: AnyObject) { 
     self.performSegueWithIdentifier("segue", sender: yourVariable) 
    } 
} 

Затем передают данные отправителя путем переопределения метода prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { 
    if (segue.identifier = "segue") { 
     let secondViewController = segue.destinationViewController as YourSecondViewController 
     let yourVariable = sender as Double 
     secondViewController.duration = yourVariable 
    } 
} 
+0

Но это работает на WatchKit? Потому что я пишу «prepareforsegue», и он не автозаполняется :( –

1

Я думаю, ваша проблема в том, что вы передавая массив в контекст, и вы передаете его как WKIntefaceController. Попробуйте заменить эту строку

let finalarrayofScores = context as? InterfaceController2 

по

let finalarrayofScores = context as? [Int] 
+0

Спасибо. Вы тоже были правы. –

+0

Добро пожаловать. Надеюсь, ваша проблема решена. –

 Смежные вопросы

  • Нет связанных вопросов^_^