Pregunta

Estoy tratando de construir un control personalizado basado en un UIWebView y compilarlo en una biblioteca para su reutilización. Todo estaba funcionando bien cuando tuve el código todos juntos en una sola aplicación de prueba pero estoy teniendo un poco de la creación de un delegado para la vista para una biblioteca de problemas. De la nota, la aplicación de ejemplo utiliza constructor de interfaces y por lo tanto el delegado se estableció a través de IB.

NewsView.h:

@interface NewsView : UIWebView {
   NSObject<UIWebViewDelegate> *delegate;
}
@property (nonatomic, assign) IBOutlet NSObject<UIWebViewDelegate> *delegate;

En la puesta en práctica todos mis métodos de inicialización llamar a un método común viewInit

NewsView.m

@implementation NewsView

@synthesize delegate;

- (void)viewInit {

    self.delegate = [[NewsViewDelegate alloc] init];
}

Si el usuario hace clic en uno de los titulares en la vista que necesito el delegado para interceptar clics y el lanzamiento de Safari.

NewsViewDelegate.h

@interface NewsViewDelegate : NSObject <UIWebViewDelegate> {
}

NewsViewDelegate.m

// Intercept URL events
- (BOOL)webView:(UIWebView *)myWebView shouldStartLoadWithRequest:
    (NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {

    NSLog(@"URL Changed");
    // Check to see if this is a click event
    if (navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[[request URL]            absoluteString]]];
            return NO;
    }

    return YES;
}

Desafortunadamente shouldStartLoadWithRequest nunca se llamaron y así clics no están poniendo en marcha el exterior.

¿Fue útil?

Solución

Es generalmente una mala idea subclase UIWebView, y los documentos asesorar específicamente en contra de ella. No sé a ciencia cierta, pero mi conjetura es que UIWebView es un conjunto de clases.

Para obtener el efecto deseado, es posible intentar hacer su NewsView un UIView llano, a continuación, añadir el UIWebView como subvista. Desde allí se puede establecer el delegado UIWebView a la NewsViewDelegate sin preocuparse de la subclase.

El mejor método podría ser la creación de una clase NewsViewController que carga el NewsView e implementa los métodos UIWebViewDelegate sí y establecer el delegado web View NewsView a su NewsViewController.

Otros consejos

Usted es sombras la propiedad delegate existente de la vista web. Trate de no incluir simplemente la propiedad delegate en la subclase. Debe ser heredada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top