Отображение перестраиваемого представления из AppDelegate на основе поискового запроса Core Spotlight

В моем приложении настроен Core Spotlight. Я перехожу к определенному контроллеру представления в контроллере навигации, который отображает веб-страницу веб-просмотра на основе заголовка. Так, например:

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler {

if ([[userActivity activityType] isEqualToString:CSSearchableItemActionType]) {
    // This activity represents an item indexed using Core Spotlight, so restore the context related to the unique identifier.
    // The unique identifier of the Core Spotlight item is set in the activity’s userInfo for the key CSSearchableItemActivityIdentifier.

    NSString *uniqueIdentifier = [userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier];
    NSString *valueForUID = [self valueForKey:uniqueIdentifier];

    self.tabBar = (UITabBarController *)self.window.rootViewController;
    self.tabBar.selectedIndex = 0;
    UINavigationController *selectedNav=(UINavigationController *)self.tabBar.selectedViewController;
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    WebViewController *webVCVC = [storyboard instantiateViewControllerWithIdentifier:@"WebViewController"];
    webVC.title = uniqueIdentifier;
    webVC.titleDetail = valueForUID;
    [selectedNav presentViewController:webVC animated:YES completion:nil];
}
}

Короче говоря, webVC загружает определенную веб-страницу на основе ее self.title и titleDetail, эти значения меняются, потому что каждый уникальный идентификатор прожектора отличается.

Проблема не в том, если выбран первый индекс прожектора, все работает нормально. однако если я нажму новую кнопку "Вернуться к %@" и вернусь в Spotlight, чтобы выбрать новый элемент поиска, я получу следующую ошибку:

Warning: Attempt to present <WebViewController: 0x7fced37c8be0> on <UINavigationController: 0x7fced403fa00> whose view is not in the window hierarchy!

Поэтому я подумал, что все, что мне нужно сделать, это каждый раз закрывать текущее представление и перезагружать его:

self.tabBar = (UITabBarController *)self.window.rootViewController;
self.tabBar.selectedIndex = 0;
UINavigationController *selectedNav=(UINavigationController *)self.tabBar.selectedViewController;
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
WebViewController *webVC = [storyboard instantiateViewControllerWithIdentifier:@"WebViewController"];
[webVC dismissViewControllerAnimated:NO completion:^{
   webVC.title = pubNum;
   webVC.titleString = pubTitle;
   [selectedNav presentViewController:webVC animated:YES completion:nil];
}];

Это тоже не работает, я получаю следующее предупреждение/ошибку:

Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior

Что имеет смысл. Как обойти это в данном конкретном случае?


person Jteve Sobs    schedule 27.08.2015    source источник
comment
Любой орган знает, как помочь?   -  person Jteve Sobs    schedule 28.08.2015
comment
Вы пытались с помощью presentedViewController узнать, есть ли представление, представленное модально, и отклонить его?   -  person maty_nz    schedule 04.09.2015
comment
Даже если бы я обнаружил, что он присутствует, и отклонил его, я все равно столкнулся бы с той же проблемой. Это позволит мне загрузить тот же вид, который будет освобожден. Итак, я думаю, реальный вопрос в том, как загрузить представление после его перераспределения или лучше, как узнать, когда освобождение завершено @maty_nz   -  person Jteve Sobs    schedule 04.09.2015
comment
Я предполагаю, что основная проблема, с которой вы столкнулись, заключается в том, что вы не можете найти модально представленный VC поверх панели вкладок и контроллера навигации. когда вы WebViewController *webVC = [storyboard instantiateViewControllerWithIdentifier:@"WebViewController"]; создаете НОВЫЙ VC, не указывая на тот, который уже находится поверх представления стека. Вы должны выяснить, что находится на вершине представления стека, а затем отклонить его без анимации, а по завершении представить с анимацией новый VC.   -  person maty_nz    schedule 04.09.2015
comment
Я сделал это @maty_nz, это в моем примере в вопросе. Мне не нужно искать, какой именно, когда я знаю какой именно   -  person Jteve Sobs    schedule 04.09.2015
comment
предупреждение/ошибка Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior связано с тем, что вы пытаетесь закрыть только что созданный VC. в webVC у вас новая ВК не та с первого открытия. Чтобы сослаться на webVC, который отображается на экране, вы можете использовать presentedViewController, а затем закрыть этот VC, а затем представить новый.   -  person maty_nz    schedule 04.09.2015


Ответы (2)


UINavigationController, несмотря на то, что он наследуется от UIViewController, не имеет собственного не-nil view, поэтому вы не можете вызвать presentViewController:animated:completion: поверх него. Я думаю, что вы путаете presentViewController (который отображает модальное окно и его необходимо отправить на отображаемый в данный момент контроллер представления) с pushViewController:animated:, который отправляется на navigationController текущего контроллера представления.

person NRitH    schedule 31.08.2015
comment
Нет, я не пытаюсь давить. Я представляю это специально (как полноэкранный веб-просмотр). Вот почему я создаю его экземпляр, чтобы я мог представить его поверх текущего контроллера представления навигации. Он работает и отлично работает в другом месте, я просто не могу перезагрузить его, когда выбран новый индекс прожектора, потому что он уже загружен в память. И URL-адрес webView загружается на основе заголовка контроллера веб-представления. - person Jteve Sobs; 31.08.2015

Я исправил это, отключив его от навигационного контроллера:

//Instead of this
[webVC dismissViewControllerAnimated...

//I used this
[selectedNav.presentedViewController dismissViewControllerAnimated...
person Jteve Sobs    schedule 04.09.2015
comment
Рад, что мой комментарий помог вам. - person maty_nz; 07.09.2015