Я предполагаю, что вы дружите с 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;
}
}
Спасибо! Это работает, но контроллер представления представления не является контроллером корневого представления, поэтому я не вижу, где бы я удалял этого наблюдателя при выводе контроллера представления (Push 2). Я отредактировал свой пост с настройкой. –
Используйте ту же стратегию. Поскольку для 'popController' нет поддержки обратного вызова завершения, единственный способ выбрать точку, когда вызывается' Push2', - '[Push1 activated]'. Когда вы нажимаете push2 из push1, вам нужно сохранить некоторую переменную состояния, которая указывает, был ли push2 представлен или нет, чтобы определить соответствующее поведение в '[Push1 activated]'. – jeeeyul
В итоге я оставил наблюдателя уведомлений в статической переменной для контроллера интерфейса «Push 2», а затем удалил наблюдателя, прежде чем добавлять его в последующие вызовы «-awakeFromContext:». Спасибо за вашу помощь! –