Как передать переменные из одного View Controller в другой в WatchOS 2 & Swift

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

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


}

И это - Контроллер Представления Пункта назначения, где я хочу иметь возможность использовать переменные 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()
    }

}

* РЕДАКТИРОВАТЬ *

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

  @IBAction func FinishButtonPushVariables() {

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

        pushControllerWithName("LastScreen", context: arrayofScores)

    }

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

  @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.
    }

3 ответа

Решение

В приложениях iOS мы используем prepareForSegue сделать это. В приложениях watchOS мы используем contextForSegueWithIdentifier передать контекст от одного interfaceController к другому.

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

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

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

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

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

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

Вот ссылка на учебник, который покажет применение этого процесса.

РЕДАКТИРОВАТЬ

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

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

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

}

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

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

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

 let finalarrayofScores = context as? InterfaceController2

от

let finalarrayofScores = context as? [Int]
Другие вопросы по тегам