6

Ho impostato Core Spotlight nella mia app. Navigazione verso uno specifico controller di visualizzazione all'interno di un controller di navigazione che visualizza una pagina Web di webview basata sul titolo. Così, per esempio:Visualizza una vista ripristinabile da AppDelegate in base al termine di ricerca 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]; 
} 
} 

In breve, il webVC carica una pagina Web specifica basata su di essa la self.title e titleDetail, questi valori cambiano perché ogni riflettori ID univoco è diverso.

Il problema non è se il primo indice Spotlight è selezionato, tutto funziona correttamente. tuttavia, se seleziono il nuovo pulsante 'Back To% @' e tornare a Spotlight per selezionare un nuovo tema, ottengo il seguente errore:

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

così ho pensato tutto quello che dovevo fare era chiudere la visualizzazione corrente ogni volta e ricaricarlo:

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

Questo non lavoro neanche, ottengo il seguente avviso/errore:

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

Il che ha senso. Come posso aggirare questo in questa particolare istanza?

+0

Qualsiasi corpo sa come aiutare? –

+0

hai provato con 'presentedViewController' per scoprire se c'è già una vista presentata modalmente e chiuderla? –

+0

Anche se ho trovato se uno è presente e lo congedo, ho ancora lo stesso problema. Mi permetterebbe di caricare la stessa vista che stia dislocando. Quindi immagino che la vera domanda sia, come caricare la vista dopo la sua riallocazione o migliore, come sapere quando un deallocate è completo @maty_nz –

risposta

0

ho riparato respingendo dal controller di navigazione:

//Instead of this 
[webVC dismissViewControllerAnimated... 

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

Contento che il mio commento ti abbia aiutato. –

0

A UINavigationController, anche se eredita da UIViewController, non hai non nilview propria, quindi non si può chiamare presentViewController:animated:completion: su di esso. Penso che tu stia confondendo lo presentViewController (che visualizza una modale e che deve essere inviato al controller della vista attualmente visualizzato) con pushViewController:animated:, che viene inviato al controller della vista corrente navigationController.

+0

No, non sto provando a spingerlo. Lo presento apposta (come una webView a schermo intero). È per questo che sto istanziando, così posso presentarlo sull'attuale controller di navigazione.Funziona e funziona bene altrove, non riesco a farlo ricaricare quando viene selezionato un nuovo indice Spotlight perché è già caricato in memoria. E l'url webView viene caricato in base al titolo del controller di visualizzazione Web –