2011-12-15 14 views
15

Tengo una UIWebView que estoy usando para mostrar varios PDF pequeños. El usuario selecciona un artículo de noticias de una tabla y luego el artículo (PDF) se carga en un UIWebView en la misma pantalla. La primera carga siempre va bien. Luego, el siguiente elemento que selecciono (no importa cuál) bloquea la aplicación.UIWebView falla en la segunda solicitud de carga de PDF

Esta es la forma en que estoy cargando cada artículo:

NSString *filePath = [[NSBundle mainBundle] pathForResource:articleFileName ofType:@"pdf"]; 
[articleView stopLoading]; 
[articleView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]]; 

El accidente se produce después de la línea loadRequest.
El bloqueo no proporciona información de error. Aparte:

.

todas las excepciones {} 0x3629f000

Catchpoint 3 (excepción lanzada) (GDB)

Sólo se bloquea a main(). He verificado en el depurador que está utilizando la ruta de archivo correcta en cada solicitud.

Tengo NSZombies en ejecución y tengo puntos de interrupción establecidos para todas las excepciones.

+0

¿El delegado de la vista web cambia? – amattn

+0

El delegado es auto (conectado a través de IB) nunca cambia. – Dancreek

+0

¿Cuál de los 4 métodos de delegado se invoca antes del bloqueo? – amattn

Respuesta

34

Tengo este problema exacto también. Muchas gracias a Steve por ayudarme a reducirlo aún más, mi excepción es la misma que la de él.

¿Tiene un descanso en todas las excepciones configuradas? Descubrí que si deshabilito ese punto de interrupción, ya no se bloquea. ¿Qué me hizo pensar que era solo un error en el nuevo depurador o la versión de iOS? La otra cosa que me hizo pensar que fue que este bloqueo no ocurre cuando corro en un dispositivo con iOS 4.3.xo el simulador 4.3.

+5

Desactivar el punto de interrupción "Romper todas las excepciones" resolvió mi problema, que venía después de UIWebPDFView _removeBackgroundImageObserverIfNeeded en stacktrace. ¿Quién pensaría que un punto de ruptura causaría un colapso? – ransomweaver

+4

Descubrí que puede continuar en el depurador después de llegar al punto de interrupción. Probablemente exista una excepción que sea capturada y manejada en el código de Apple, por lo que incluso a pesar de que la excepción desencadena el punto de interrupción, no provoca un colapso. –

+1

Este "error" me estaba volviendo loco. Muy agradecido por la respuesta. –

9

Estoy viendo algo similar, tanto al liberar una vista web después de cargar un PDF o al cargar html después de cargar un PDF. Parece ser rdar: // 10431759 (ver http://openradar.appspot.com/10431759). No tengo una forma de evitarlo. Puedo reproducirlo cargando un pdf y luego cargando la cadena html @"<div></div>", por lo que no parece ser un problema de delegado.

Si escribe "bt" en la consola GDB, es posible obtener la StackTrace real, incluyendo:

#0 0x37ccd1c8 in objc_exception_throw() 
#1 0x381817b8 in +[NSException raise:format:arguments:]() 
#2 0x381817b8 in +[NSException raise:format:arguments:]() 
#3 0x381817da in +[NSException raise:format:]() 
#4 0x35462628 in -[NSObject(NSKeyValueObserverRegistration) _removeObserver:forProperty:]() 
#5 0x35462296 in -[NSObject(NSKeyValueObserverRegistration) removeObserver:forKeyPath:]() 
#6 0x31fc3448 in -[UIWebPDFView _removeBackgroundImageObserverIfNeeded:]() 
#7 0x31fc36a8 in -[UIWebPDFView dealloc]() 
#8 0x37cc90c4 in _objc_rootRelease() 
#9 0x31dd2614 in -[UIWebPDFViewHandler clearAllViews]() 
#10 0x31d76708 in -[UIWebPDFViewHandler _replacePDFViewIfPresentWithWebDocView:]() 
#11 0x31d766a6 in -[UIWebPDFViewHandler _removePDFViewIfWebDocViewIsNotPDF:]() 
#12 0x31d76644 in -[UIWebBrowserView webView:didFirstVisuallyNonEmptyLayoutInFrame:]() 

Al depurar en el dispositivo, puede escribir "trama 0" y "po $ r0" para ver el mensaje de excepción: (Creo que es "po $ eax" en el simulador.)

(gdb) frame 0 
#0 0x37ccd1c8 in objc_exception_throw() 
(gdb) po $r0 
Cannot remove an observer <UIWebPDFView 0x4a3200> for the key path "backgroundImage" from <UIPDFPageView 0x4a4bf0> because it is not registered as an observer. 

Editar: Este problema sólo parece ocurrir cuando tengo "Romper con el tiro" encendido durante Objetivo- C excepciones

0

Tuve un problema similar, con mi UIWebView colgando (simplemente congelando en una pantalla gris con el círculo giratorio de "carga" que nunca finalizó). Si salí del programa, lo haría colapsar la segunda vez que lo cargué.

Finalmente hice suficiente búsqueda y encontré que si cargaba una fuente de etiqueta (con un CCLabelTTF usando Cocos2d) primero desde el paquete de recursos de la aplicación, ENTONCES traté de cargar el PDF, entonces funcionaría y no chocaría.

Es un truco muy feo, pero alguien más puede encontrarlo útil.

// HACK: Loading a TTF font first is needed to properly load PDF/HTML 
CCLabelTTF* label = [CCLabelTTF labelWithString:@"Testing" fontName:@"DIN-Black" fontSize:12]; 
[label setVisible:false]; 

// We never actually use the label -- we just create it so that it loads the font 
NSString *path = [[NSBundle mainBundle] 
        pathForResource:myPDF 
        ofType:@"pdf"]; 

CCLOG(@"Retrieving PDF from '%@'", path); 

NSURL *pdfUrl = [NSURL fileURLWithPath:path]; 
NSURLRequest *request = [NSURLRequest requestWithURL:pdfUrl]; 

[webView loadRequest:request]; 
[webView setScalesPageToFit:YES]; 
[super onEnter]; 
Cuestiones relacionadas