Почему я не могу передавать данные между контроллерами интерфейса для Apple Watch?

По сути, я пытаюсь передать целое число из одного контроллера интерфейса. Ползунок в контроллере "SecondPage" получит целочисленное значение из ползунка и должен отправить его в контроллер интерфейса с именем "ThirdPage" и установить для заголовка этой метки значение. Я пробовал так много методов, но все безрезультатно. Я просто пытаюсь отправить контекст со 2-го контроллера интерфейса, получить его в активном (withContext context: Any?) Методе в 3-м контроллере и сохранить его в качестве заголовка, пока ползунок не будет снова изменен.

Вот что я попробовал сначала на контроллере второй страницы, но он не передал никаких данных:

override func contextForSegueWithIdentifier(segueIdentifier: String) -> AnyObject? {
if segueIdentifier == "ThirdPage"{
    return sliderval
}
return nil
}

вот что я попробовал после этого: он передал данные, но не "сохранил" их. Он открывает интерфейсный контроллер с обновленной меткой в ​​значении ползунка, но я не хочу, чтобы он всплывал, я хочу, чтобы это значение было сохранено в метке. Когда я закрываю всплывающее окно и смахиваю вправо на третью страницу, ярлык по-прежнему называется "Метка"

self.presentController(withName: "ThirdPage", context: sliderval)

Вот некоторые картинки вывода, а также мой код. Любая помощь приветствуется, спасибо. PS: это все в Swift 3 введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

2 ответа

Решение

Вы используете навигацию на основе страниц, и вам нужно передавать данные между страницами.

Я хотел бы сохранить данные с ползунка где-нибудь, к которому может получить доступ третья страница, и заполнить данные в метке на willActivate, willActivate метод должен вызываться системой, когда пользователь перемещается между страницами.

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

var sliderValue: Float = 0

Во втором контроллере интерфейса установите это значение при изменении ползунка.

@IBAction func sliderChanged(_ value: Float) {
    sliderValue = value
}

В вашем третьем контроллере интерфейса, когда страница должна появиться, установите для метки правильное значение.

override func willActivate() {
    label.setText("\(sliderValue)")
}

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

Ваша нежелательная проблема всплывающего окна происходит, потому что вы звоните presentController() в sliderChanged(), Каждый раз, когда ползунок меняется, вы говорите, чтобы он поднял контроллер "ThirdPage". Вы можете просто удалить это.

Изменить: Мой ответ неправильно предполагал, что спрашивающий работает с иерархической навигацией. Для навигации на основе страниц, по-видимому, нет способа передать данные с одной страницы на другую, поэтому вы застряли с использованием глобального, как предполагает принятый ответ. Исходный ответ следует:

Что касается отсутствия передаваемого контекста, я бы предположил, что у вас, вероятно, нет идентификатора segue, установленного в Интерфейсном Разработчике, или он имеет значение, отличное от "ThirdPage". Эта тема отделена от контроллера "ThirdPage", и вы должны установить его идентификатор отдельно. Нажмите на кружок в середине стрелки перехода и посмотрите на него в инспекторе Атрибутов.

Если предположить, что я прав, проблема в том, что contextForSegueWithIdentifier() вызывается с идентификатором, который вы не ожидаете. Поскольку это не "ThirdPage", условное условие завершается неудачно и возвращает ноль. Установка идентификатора segue должна исправить это.

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