Проблема с потоком WatchKit между классами

У меня есть два класса с именами InterfaceController и LoadInterfaceController.

Я звоню uiChange function InterfaceController со своего LoadInterfaceController:

InterfaceController *interfaceController = [InterfaceController alloc];
//[interfaceController performSelectorOnMainThread:@selector(uiChange) withObject:nil waitUntilDone:true];
[interfaceController uiChange];

Вызывается function, но пользовательский интерфейс в InterfaceController не изменяется.

- (void)uiChange {
    NSLog(@"uiChange was called");
    //... make changes to the UI ...
}

Если function вызывается из function, происходящего из InterfaceController class, соответственно изменяется пользовательский интерфейс.

Я попытался вызвать uiChange на main thread (как описано здесь), но Пользовательский интерфейс не отвечает. Как я могу указать поток, используемый для пользовательского интерфейса InterfaceController?


person Aleksander Azizi    schedule 17.09.2015    source источник


Ответы (1)


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

Я бы предложил добавить в вашу архитектуру шаблон Pub/Sub. Класс NSNotificationCenter — хороший пример его реализации. Это позволяет частям приложения взаимодействовать друг с другом, а также очень часто используется для связи контроллеров.

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

person Dmytro Hutsuliak    schedule 17.09.2015
comment
Проблема по-прежнему сохраняется даже при использовании NSNotificationCenter для связи между классами. - person Aleksander Azizi; 18.09.2015
comment
@Александр Азизи - Вы должны подробнее описать свою задачу. Почему вы пытаетесь инициировать изменения пользовательского интерфейса другого контроллера, который в данный момент не отображается? Используйте метод willActivate() класса InterfaceController в сочетании с одноэлементной моделью из предыдущего вопроса, чтобы инициализировать ваш пользовательский интерфейс перед загрузкой. - person Dmytro Hutsuliak; 18.09.2015
comment
Я должен признать, что использование NSNotificationCenter более приемлемо в iOS, когда используются вложенные `UIViewControllers', другими словами, одновременно отображается более одного контроллера, как здесь: stackoverflow.com/a/17499426/3242031 Попробуйте использовать подход из предыдущего комментария. - person Dmytro Hutsuliak; 18.09.2015
comment
После передачи данных из LoadInterfaceController необходимо обновить WKInterfaceTable из InterfaceController. Это управляется с помощью ранее упомянутой функции uiChange. - person Aleksander Azizi; 18.09.2015
comment
Извините, но я запутался с вашей задачей. Я чувствую, что вы делаете что-то не так, но в любом случае я рад, что это что-то работает для вас. - person Dmytro Hutsuliak; 18.09.2015
comment
Ты был прав все это время. Пользовательский интерфейс не может быть обновлен при инициализации в новом экземпляре. - person Aleksander Azizi; 02.10.2015