В моем приложении настроен 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
Что имеет смысл. Как обойти это в данном конкретном случае?
presentedViewController
узнать, есть ли представление, представленное модально, и отклонить его? - person maty_nz   schedule 04.09.2015WebViewController *webVC = [storyboard instantiateViewControllerWithIdentifier:@"WebViewController"];
создаете НОВЫЙ VC, не указывая на тот, который уже находится поверх представления стека. Вы должны выяснить, что находится на вершине представления стека, а затем отклонить его без анимации, а по завершении представить с анимацией новый VC. - person maty_nz   schedule 04.09.2015Attempting 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