wkinterfacecontroller’s becomeCurrentPage работает не так, как ожидалось

#ios #swift #watchkit #apple-watch #wkinterfacecontroller

#iOS #swift #watchkit #apple-watch #wkinterfacecontroller

Вопрос:

Я загружаю 4 WKInterfaceControllers в горизонтальный интерфейс на основе страницы в WatchKit. введите описание изображения здесь Когда срабатывает обратный вызов делегата, предупреждающий приложение о том, что экран заблокирован водой, я хочу, чтобы часы переключались на один из контроллеров (на основе пользовательских настроек). Используя приведенный ниже код, если делегат срабатывает при блокировке воды, приложение перейдет к MainDisplayInterfaceController ожидаемому. Однако, если делегат запускается в любом из двух других интерфейсных контроллеров, экран, похоже, переходит, но затем возвращается к исходному WorkoutControlsInterfaceController (т. Е. 0). однако управление страницей в нижней части экрана находится на 2 из 4? Может ли это быть ошибкой WatchKit?

РЕДАКТИРОВАТЬ: одна подсказка, которую я заметил, заключается в том, что при первом блокировке воды я получаю описанное выше поведение. Но если я разблокирую, а затем снова заблокирую, я получаю ожидаемое поведение. 🤔

  class ConfigureWorkoutInterfaceController: WKInterfaceController {
       WKInterfaceController.reloadRootPageControllers(withNames: ["WorkoutControlsInterfaceController", "MainDisplayInterfaceController", "SpeedInterfaceController", "CaloriesAndDistanceInterfaceController"],
                                                            contexts: [contextDictionary, contextDictionary, contextDictionary, contextDictionary],
                                                            orientation: .horizontal,
                                                            pageIndex: 1)
        }
    }

    extension MainDisplayInterfaceController: WaterLockStateDelegate {
        func didUpdateWaterLockState(_ manager: WorkoutManager, state: Bool) {
                     DispatchQueue.main.async {
                        self.becomeCurrentPage()
                    }
        }


    }

    extension SpeedInterfaceController: WaterLockStateDelegate {
        func didUpdateWaterLockState(_ manager: WorkoutManager, state: Bool) {
                     DispatchQueue.main.async {
                        self.becomeCurrentPage()
                    }

    }

    extension CaloriesAndDistanceInterfaceController: WaterLockStateDelegate {
        func didUpdateWaterLockState(_ manager: WorkoutManager, state: Bool) {
                     DispatchQueue.main.async {
                        self.becomeCurrentPage()
                    }
    }