WKInterfaceController с модальным переходом

Я представляю WKInterfaceController с модальным переходом от другого контроллера интерфейса.

Когда вы касаетесь строки в таблице этого контроллера модального интерфейса, как мне закрыть этот контроллер интерфейса и связаться с представленным контроллером интерфейса?

Это моя текущая настройка раскадровки.

[Root] -> [Push 1] -> [Push 2] -> [Modal]

person Berry Blue    schedule 23.11.2015    source источник


Ответы (1)


Я предполагаю, что вы дружите с NSNotificationCenter.

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

Получить доступ к корневому контроллеру можно:

[WKExtension sharedExtension].rootInterfaceController

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

-(void) didTapARowInTable
{
    NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
    [nc postNotificationName:@"UseDidTapARowFromModal"
                      object:self
                    userInfo:@{/* data that will be needed 
                                  to present new modal here */}];

    // close current modal.
    [self dismissController];
}

Во-вторых, любой код пользовательского интерфейса в WKInterfaceController не будет работать, если он не активен. Все WKInterfaceObject являются объектами запроса, которые связаны с реальными удаленными пользовательскими интерфейсами (вы знаете, что файлы раскадровки находятся в отдельном пакете). Когда удаленный пользовательский интерфейс не отображается, контроллер интерфейса для него деактивируется, и он больше не может отправлять запрос на изменение пользовательского интерфейса реальным объектам пользовательского интерфейса. Он может изменять свое собственное состояние только тогда, когда он не активирован.

Таким образом, родительский контроллер не должен получать доступ к любому API пользовательского интерфейса, пока он не будет активирован (например, отображение нового модального окна или изменение объектов WKInterface). Итак, в вашем родительском контроллере сделайте следующее:

-(void)didReceiveTapRowNotification:(NSNotification*) note
{
    // just remember task to perform, don't use any UI code here.
    _taskInfo = note.userInfo;
}

-(void)willActivate
{
    [super willActivate];

    // check scheduled task and do it if exists.
    if(_taskInfo){
        [self presentControllerWithName:@"modal-name" 
                                context:_taskInfo];
        _taskInfo = nil;
    }
}
person jeeeyul    schedule 26.11.2015
comment
Спасибо! Это действительно работает, но контроллер представления представления не является контроллером корневого представления, поэтому я не вижу, где я мог бы удалить этого наблюдателя, когда контроллер представления представления (Push 2) выталкивается. Я отредактировал свой пост с настройкой. - person Berry Blue; 27.11.2015
comment
Используйте ту же стратегию. Поскольку для popController нет поддержки обратного вызова завершения, единственный способ выбрать точку, когда Push2 выталкивается, - это [Push1 activated]. Когда вы отправляете push2 из push1, вы должны сохранить некоторую переменную состояния, которая указывает, был ли представлен push2 или нет, чтобы определить соответствующее поведение на [Push1 activated]. - person jeeeyul; 27.11.2015
comment
В итоге я просто держал наблюдателя уведомлений в статической переменной для контроллера интерфейса Push 2, а затем удалял наблюдателя, прежде чем снова добавлять его в последующих вызовах -awakeFromContext:. Спасибо за вашу помощь! - person Berry Blue; 27.11.2015