6

J'ai installé Core Spotlight dans mon application. Je navigue vers un contrôleur de vue spécifique dans un contrôleur de navigation qui affiche une page Web basée sur le titre. Ainsi, par exemple:Afficher une vue modifiable d'AppDelegate basée sur le terme de recherche 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]; 
} 
} 

En bref, le webVC charge une page Web spécifique basée sur sa self.title et titleDetail, ces valeurs changent parce que chaque ID de projecteur unique est différent.

Le problème n'est pas si le premier index spotlight est sélectionné, tout fonctionne bien. cependant, si je sélectionne la nouvelle « Back To% @ » bouton et revenir à Spotlight pour sélectionner un nouvel élément de recherche, je reçois l'erreur suivante:

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

donc je pensais que je devais faire était de rejeter la vue actuelle chaque fois et le recharger:

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]; 
}]; 

Ce ne le fait pas travail non plus, je reçois l'avertissement/erreur suivant:

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

Ce qui est logique. Comment est-ce que je contourne ceci dans ce cas particulier?

+0

Tout organisme savent comment aider? –

+0

avez-vous essayé avec 'presentedViewController' pour savoir s'il y a déjà une vue présentée modalement et la rejeter? –

+0

Même si j'ai trouvé si quelqu'un est présent et le rejeter, je rencontre toujours le même problème. Cela me permettrait de charger le même point de vue s'il est désaffecté. Donc, je suppose que la vraie question est, comment charger la vue après sa réaffectée ou mieux, comment savoir quand un deallocate est complète @maty_nz –

Répondre

0

Je l'ai fixé en l'écartant du contrôleur de navigation:

//Instead of this 
[webVC dismissViewControllerAnimated... 

//I used this 
[selectedNav.presentedViewController dismissViewControllerAnimated... 
+0

Heureux que mon commentaire vous a aidé. –

0

A UINavigationController, même si elle hérite de UIViewController, n'a pas de nilview non propre, de sorte que vous ne pouvez pas appeler presentViewController:animated:completion: au-dessus de celui-ci. Je pense que vous confondez presentViewController (qui affiche un modal, et doit être envoyé au contrôleur de vue qui est actuellement affiché) avec pushViewController:animated:, qui est envoyé au navigationController du contrôleur de vue actuel.

+0

Non je n'essaie pas de le pousser. Je le présente exprès (en tant que WebView en plein écran). C'est pourquoi je l'instancie pour que je puisse le présenter sur le contrôleur de navigation actuel.Cela fonctionne et fonctionne très bien ailleurs, je ne peux tout simplement pas le recharger quand un nouvel index Spotlight est sélectionné car il est déjà chargé en mémoire. Et l'URL WebView est chargée en fonction du titre des contrôleurs de vue Web –