2015-01-04 11 views
7

mia gerarchia della vista si presenta così:Premere a lungo porta ad un errore/avviso quando WKWebView cerca di presentare un WKActionSheet

  • (root) PRSBaseViewController - una sottoclasse UIViewController - ha viewControllers bambino
    • (presentato) PRSModalWebViewController - una sottoclasse UINavigationController
      • (spinto, animato: NO) PRSWebViewController - una sottoclasse UIViewController - WKWebView è una sottoview.

Quando provo e premere a lungo su un link nella WebView ottengo l'errore:

Warning: Attempt to present <WKActionSheet: 0x127520d10> on <PRSBaseViewController: 0x1275117f0> whose view is not in the window hierarchy!

Invece di presentare la navigazione utilizzando presentViewController:animated:completion e di utilizzare invece il addChildViewController: ballare per aggiungerlo al controller della vista nella gerarchia. Non ho errori, è piuttosto strano.

Qualcuno sa che cosa potrebbe causare problemi di gerarchia delle viste?

Update: Ho fatto un Gist of all my classes

+0

Forse duplicato di http://stackoverflow.com/questions/26460417/disable-wkactionsheet-on-wkwebview – matt

+2

@matt Non sto cercando di sopprimere i fogli di condivisione, sono stati soppressi contro la mia volontà. Il comportamento che non voglio e sto ottenendo è la risposta alla sua domanda. –

+0

Questa è la cosa, è la classe privata di Apple. Ho postato il mio problema nei forum degli sviluppatori per buona misura. Grazie per esserti assicurato. –

risposta

13

mi sono imbattuto in un comportamento simile - e non hanno capito come e perché questo accade sia.

Ecco la mia soluzione. Poiché WKWebView chiama il mio RootViewController, sto gestendo ciò ignorando il presentViewController di RootViewController: animated: completion: - e se il RootViewController ha già un ViewController presentato, quindi inoltra il messaggio a quel controller. Sembra indirizzare il messaggio di avviso e mi dà il menu di pressione lunga quando si utilizza WKWebView all'interno di una vista modale.

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion { 

    // Unsure why WKWebView calls this controller - instead of it's own parent controller 
    if (self.presentedViewController) { 
     [self.presentedViewController presentViewController:viewControllerToPresent animated:flag completion:completion]; 
    } else { 
     [super presentViewController:viewControllerToPresent animated:flag completion:completion]; 
    } 
} 

O in rapida:

override func presentViewController(viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?) { 
    if presentedViewController != nil { 
     // Unsure why WKWebView calls this controller - instead of it's own parent controller 
     presentedViewController?.presentViewController(viewControllerToPresent, animated: flag, completion: completion) 
    } else { 
     super.presentViewController(viewControllerToPresent, animated: flag, completion: completion) 
    } 
} 
+1

Questo è esattamente quello che ho fatto, ho appena dimenticato di rispondere alla mia domanda. –

+0

Quindi questa correzione mostra il foglio delle azioni o lo sta sovrasprudendo? Mi piacerebbe vedere il foglio di azione nella mia app in modo che io possa eseguire qualche azione – Alix

+0

Ciò ha permesso alla mia applicazione di mostrarlo. – Todd

4

Abbiamo visto questo problema in PSPDFKit come bene e dopo aver esaminato l'assemblaggio UIKit e WKWebView fonti abbiamo trovato una soluzione alternativa che è ancora orribile, ma non invasivo.

La strategia principale è quella di essere selettivi e applicare una soluzione in tempo utile, quindi ripulire. È possibile leggere il codice sorgente qui:

https://gist.github.com/steipete/b00fc02aa9f1c66c11d0f996b1ba1265

E per favore ingannare rdar://26295020 quindi questo sarà ottenere auspicabilmente risolto in tempo per iOS 10.

(Il bug esiste dal iOS 8 e è stata riportata su iOS 8b5).
+1

Questo funziona anche con una lunga catena arbitraria di controller di visualizzazione presentati sconosciuti, di cui abbiamo bisogno perché lavoriamo su un framework, quindi non controllare tutti i controller di visualizzazione nell'app. –