Как передать переменные из одного 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]