2010-02-07 2 views
1

Je suis en train de construire un contrôle personnalisé basé sur un UIWebView et le compiler dans une bibliothèque pour réutilisation. Tout fonctionnait très bien quand j'avais le code tous ensemble dans une application de test unique mais j'ai du mal à mettre en place un délégué pour la vue d'une bibliothèque. Il est à noter que l'exemple d'application utilisait le constructeur d'interface et que le délégué était donc défini via IB.Définition d'un UIWebViewDelegate programatically

NewsView.h:

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

Dans la mise en oeuvre toutes mes méthodes d'initialisation appellent une méthode commune viewInit

NewsView.m

@implementation NewsView 

@synthesize delegate; 

- (void)viewInit { 

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

Si l'utilisateur clique sur l'un des titres dans la vue, j'ai besoin du délégué pour intercepter les clics et lancer 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; 
} 

Malheureusement shouldStartLoadWithRequest ne sera jamais appelé et ainsi de clics ne sont pas lancés à l'extérieur.

Je suis sûr que je suis juste manque quelque chose, toute aide serait grandement apprécié.

Merci!

Répondre

2

Il est généralement une mauvaise idée de sous-classe UIWebView, et la documentation expressément l'attention contre elle. Je ne sais pas avec certitude, mais je suppose que UIWebView est un cluster de classe.

Pour obtenir l'effet souhaité, vous pouvez essayer de rendre votre NewsView UIView vierge, puis ajouter le UIWebView en tant que sous-vue. De là, vous pouvez définir le délégué UIWebView à NewsViewDelegate sans vous soucier de la sous-classe. La meilleure méthode peut être de créer une classe NewsViewController qui charge votre NewsView et implémente elle-même les méthodes UIWebViewDelegate et définit le délégué WebView NewsView sur votre NewsViewController.

+0

Merci Tyson, je vais essayer ce changement et faire un rapport. J'apprécie ton aide. Y a-t-il un lien que vous pourriez partager concernant le conseil de ne pas sous-classer? J'ai lu la vue d'ensemble à http://developer.apple.com/mac/bibliothèque/DOCUMENTATION/Cacao/Référence/WebKit/Classes/WebView_Class/Référence/Reference.html et ne l'ai pas (ou tout simplement avoir la fatigue doc et manqué). Merci encore! –

+0

Ce sont la référence OS X WebView, vous devriez regarder la référence iPhone UIWebView. http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/Reference/Reference.html Heureusement, les docs iPhone montrent toujours d'abord dans mes recherches. Sinon, je suis sûr que je ferais probablement la même chose tout le temps. :-) Comme – kubi

+0

kubi dit, il est dans la documentation de l'iPhone ici: http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIWebView_Class/Reference/Reference.html aux notes de sous-classement dans la liste. Matt Gallagher a un bon poste sur les clusters de classe subclassing ici: http://cocoawithlove.com/2008/12/ordereddictionary-subclassing-cocoa.html –

1

Vous êtes l'ombrage la propriété existante delegate de la WebView. Essayez de ne pas inclure la propriété delegate dans votre sous-classe. Cela devrait être hérité.

+0

Merci St3fan, j'a essayé plus tôt et puis juste à nouveau, mais il ne semble pas faire l'affaire. À partir du code ci-dessus, je viens de parler toutes la définition de délégué/synthèse dans le .h & .m mais gauche self.delegate = [[NewsViewDelegate alloc] init]; dans la méthode viewInit mais cela n'a pas changé le comportement. Je suis sûr que c'était un problème, mais quelque chose d'autre est faux aussi bien. Merci encore, je vous remercie de votre prendre le temps d'examiner et de conseiller. –

Questions connexes