Почему я не могу передавать данные между контроллерами интерфейса для 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 должна исправить это.