Swift WKInterfaceLabel IBOutlet замораживает приложение Watchkit при запуске

Я пытаюсь сделать простой пример приложения для часов: метка и кнопка. Нажмите кнопку и текст метки должен измениться.

@IBOutlet var myLabel: WKInterfaceLabel!
@IBOutlet var myButton: WKInterfaceButton!

Следующий код приводит к бесконечному вращающемуся колесу, когда я запускаю приложение в симуляторе, как показано на скриншоте:

@IBAction func sampleFunc() {
        myLabel.setText("hello world")
        myButton.setTitle("hermes")
}

Иметь ввиду. Приложение никогда не загружается. Я никогда не вижу кнопку или ярлык. Он просто застрял на этом вращающемся белом колесе точек.

Но если я возьму точно такой же код и просто закомментирую метку, приложение для часов загрузится и будет работать нормально.

@IBAction func sampleFunc() {
        //myLabel.setText("hello world")
        myButton.setTitle("hermes")
}

Результаты в:

И если я нажму кнопку, она изменится на "Гермес", как и предполагалось:

С какой стати это случилось? Я сидел здесь в течение четырех часов, пытаясь понять это. Метка связана как IBOutlet. Я очистил проект. Я выключил XCode, перезагрузил весь компьютер. Я сделал второй проект с нуля. Все так же. Почему я не могу просто оставить этот ярлык без комментариев? Почему приложение никогда не загружается, если ярлык не комментируется при нажатии кнопки? Дополнительная информация: Даже если я размещу нескомментированный ярлык в другом месте, например, в методе willActivate(), он будет вести себя так же, как и приложение никогда не загружается.

1 ответ

Решение

Ницца! После нескольких часов решительных усилий над этим, только процесс публикации вопроса в Stackru помог мне заметить ответ. Я заметил это краем глаза на нескольких примерах, но никогда не думал, что это действительно имеет значение. Я говорю о "слабом". Ответ прост: ярлык WKInterfaceLabel должен быть слабым. Принимая во внимание, что я объявил вар как это:

@IBOutlet var myLabel: WKInterfaceLabel!

Мне действительно нужно было сделать это (обратите внимание на "слабых"):

@IBOutlet weak var myLabel: WKInterfaceLabel!

Мне довелось увидеть его довольно близко к началу этой страницы документации Apple Swift в качестве примера Swift.

Когда я попробовал, это сработало!

Другие вопросы по тегам