OK. Это достаточно просто сделать в классической iOS, но WatchKit не дает никаких блоков / закрытий, и нет выбора между с / без анимации.

У меня есть корневой контроллер со списком опций. Прикосновение к одной из опций (на часах или телефоне) закроет любой открытый в данный момент контроллер (popToRootController), затем немедленно нажмите новый < / а>.

Примерно так:

self.popToRootController()
self.pushController(withName: "IKANHAZCHEEZEBURGR", context: nil)

Проблема в том, что между вызовами недостаточно времени, и у меня нет лямбды для выполнения семафора или нажатия контроллера.

Если я перейду через отладчик, это произойдет, без проблем. Если я просто нажму «Беги», это не сработает. Это то, что известно как «heisenbug».

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

Есть идеи получше? Что мне не хватает?

Я знаю, что для iOS есть ТОННА ответов. Здесь они не делают мне много добра.

0
Chris Marshall 23 Июн 2017 в 22:42

1 ответ

Лучший ответ

Что ж, я уступил Темной стороне и взломал таймер. Оно работает. Мне нужно дать около 0,4 секунды на каждый открытый контроллер.

Вот пример того, что я сделал:

self.popToRootController()
let _ = Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.timerCallback(_:)), userInfo: nil, repeats: false)

func timerCallback(_ timer: Timer) {
    if let timerIndex = timer.userInfo as? Int {
        if 0 <= timerIndex {
            DispatchQueue.main.async {self.pushController(withName: "IKANHAZCHEEZEBURGR", context: nil)}
        }
    }
}

ОБНОВЛЕНИЕ: Я хочу упомянуть, что, хотя это «решает» мою проблему, проблема в том, что эта проблема даже является проблемой, остается проблемой. Мой дизайн был плохим, и я переделываю базовую навигацию. Я буду использовать постраничный подход вместо этого иерархического дизайна.

По общему принципу, если мне нужно взломать, чтобы он заработал, мне лучше сделать это по-другому.

0
Chris Marshall 26 Июн 2017 в 21:44