2015-11-23 2 views
3

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

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

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

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

ответ

3

Я предполагаю, что вы дружите с 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 s - объект запроса, который связан с реальными удаленными пользовательскими интерфейсами (вы знаете, что файлы раскадровки находятся в отдельном комплекте). Когда удаленный пользовательский интерфейс не отображается, контроллер интерфейса для него деактивируется и не может отправлять запрос на изменение пользовательского интерфейса к реальным объектам пользовательского интерфейса. Он может изменять только собственное состояние, когда оно не активировано.

Таким образом, родительский контроллер не должен получать доступ к любому интерфейсу 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; 
    } 
} 
+0

Спасибо! Это работает, но контроллер представления представления не является контроллером корневого представления, поэтому я не вижу, где бы я удалял этого наблюдателя при выводе контроллера представления (Push 2). Я отредактировал свой пост с настройкой. –

+0

Используйте ту же стратегию. Поскольку для 'popController' нет поддержки обратного вызова завершения, единственный способ выбрать точку, когда вызывается' Push2', - '[Push1 activated]'. Когда вы нажимаете push2 из push1, вам нужно сохранить некоторую переменную состояния, которая указывает, был ли push2 представлен или нет, чтобы определить соответствующее поведение в '[Push1 activated]'. – jeeeyul

+0

В итоге я оставил наблюдателя уведомлений в статической переменной для контроллера интерфейса «Push 2», а затем удалил наблюдателя, прежде чем добавлять его в последующие вызовы «-awakeFromContext:». Спасибо за вашу помощь! –

Смежные вопросы