Einstellung einer UIWebViewDelegate programmgesteuert
Ich versuche zum erstellen eines benutzerdefinierten Steuerelements basierend auf einer UIWebView und kompilieren Sie es in einer Bibliothek zur Wiederverwendung. Alles lief gut, wenn ich hatte den code alle zusammen in einem einzigen test-app, aber ich habe einige Probleme beim einrichten ein der Delegierten für die Ansicht für eine Bibliothek. Der Hinweis, die Beispiel-app verwendet, interface builder und somit die Stellvertretung wurde festgelegt, über IB.
NewsView.h:
@interface NewsView : UIWebView {
NSObject<UIWebViewDelegate> *delegate;
}
@property (nonatomic, assign) IBOutlet NSObject<UIWebViewDelegate> *delegate;
In der Umsetzung alle meine Initialisierung Methoden aufrufen, eine gemeinsame Methode viewInit
NewsView.m
@implementation NewsView
@synthesize delegate;
- (void)viewInit {
self.delegate = [[NewsViewDelegate alloc] init];
}
Wenn der Benutzer klickt auf eine der überschriften in der Ansicht ich brauche die Delegierten zum abfangen von Mausklicks und starten Sie 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;
}
Leider shouldStartLoadWithRequest nie aufgerufen wird, und also Klicks, die nicht von außen angestoßen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist in der Regel eine schlechte Idee, Unterklasse
UIWebView
, und die docs ausdrücklich abraten. Ich weiß es nicht sicher, aber meine Vermutung ist, dassUIWebView
ist eine Klasse cluster.Um den Effekt zu bekommen, die Sie wollen, könnten Sie versuchen, Ihre NewsView einer Ebene
UIView
, dann fügen Sie dieUIWebView
als Untersicht. Von dort aus können Sie die UIWebView Delegierter des NewsViewDelegate, ohne sich Gedanken über die Unterklasse.Die beste Methode sein könnte, um zu erstellen ein NewsViewController Klasse, lädt Ihre NewsView und implementiert die
UIWebViewDelegate
Methoden selbst, und legen Sie die NewsView webView Delegat zu Ihrem NewsViewController.Sind Sie shadowing die bestehenden
delegate
Eigenschaft der webview. Versuchen Sie einfach nicht diedelegate
Eigenschaft in der Unterklasse. Es sollte vererbt werden.