UIWebView no llama a los methods UIScrollViewDelegate

En mi aplicación para iPhone, establezco el delegado de mi uiwebview en el propietario de los files, pero no llama a los methods uiscrollviewdelegate

mi código es

- (void)webViewDidStartLoad:(UIWebView *)webView{ NSLog(@"webViewDidStartLoad "); } - (void)webViewDidFinishLoad:(UIWebView *)webView{ NSLog(@"webViewDidFinishLoad "); } - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidEndDecelerating "); } - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"scrollViewDidScroll "); } 

pero estoy recibiendo

 webViewDidStartLoad webViewDidFinishLoad 

estos posts en la console.

Qué está mal conmigo

Gracias por adelantado

La propiedad de delegate UIWebView solo le permite configurar el delegado para el protocolo UIWebViewDelegate . (Mira aquí la reference de UIWebView ).

UIWebView es en sí mismo un UIScrollViewDelegate , ya que recibe las llamadas de delegado del UIScrollView que contiene. Lamentablemente, no tiene acceso API a ese UIScrollView , por lo que no puede cambiar su delegado; por lo tanto, permanece codificado en el UIWebView sí mismo.

Ahora, hay varias forms en que puede intentar get esos posts delegates.

Una forma de get llamadas UIScrollViewDelegate es subclassando UIWebView , si eso funciona. En cualquier caso, debe tener mucho cuidado, ya que dependiendo de lo que haga puede romper la integridad de UIWebView y algunas características podrían dejar de funcionar (posiblemente con algún futuro lanzamiento del SDK). Además, Apple desaconseja hacer eso, aunque no hará que su aplicación sea rechazada (según muchas personas que informaron que hicieron eso y no tuvieron problemas con la aprobación de App Store).

Otro enfoque podría ser iterar a través de las subviews de su UIWebView hasta que encuentre un object UIScrollView y luego cambie su delegado.

 UIScrollView* scrollView = nil; for (UIView* subview in [webView subviews]) { if ([subview isKindOfClass:[UIScrollView class]]) { scrollView = (UIScrollView*)subview; scrollView.delegate = <YOUR_DELEGATE_HERE>; break; } } 

No estoy seguro de si esto es confiable o puede romper cualquier cosa, ya que el acoplamiento entre UIWebView y su hijo UIScrollView es muy ajustado y no se describe en ninguna parte, pero puede intentarlo. Con todo, no creo que esto sea mucho mejor que subclasificar UIWebView .

Finalmente, un tercer enfoque es definir tu propio tipo de UIWindow . Esto le permitirá anular algunos methods key ( sendEvent o hitTest:event: sendEvent para que pueda interceptar los toques antes de que se envíen a nivel de vista. Esto te dará la oportunidad de manejarlos y, si es necesario, evitar que scopen su objective original.

Esta es la solución más limpia, aunque es más trabajo y requerirá que defina una UIWindow personalizada en la que realice todos los reconocimientos / despachos táctiles.

Un tutorial que describe cómo sobrescribir sendEvent está disponible aquí .

Para aquellos que cuidan la solución SWIFT 3:

establezca UIScrollViewDelegate y luego aquí hay un ejemplo:

 var noticias: UIWebView! noticias.scrollView.delegate = self 

UIWebView tiene su propio UIScrollView. self.webView.scrollView.delegate = self; pueda intentar esto self.webView.scrollView.delegate = self;

el scrollView de UIWebView en realidad tiene una propiedad de delegado grabable desde iOS2. Funciona perfectamente para que lo use.