I’ve seen a number of questions about UIWebViewDelegates on stackoverflow, but they’ve been either about something different from my problem or too over my head for me to understand (or both).
My UIWebView loads fine, but I want to be able to take certain actions if the user clicks on a link within the webview once it’s loaded. In viewDidLoad I’ve set self.webV.delegate = self; (webV is the property that instantiates GHWebView, my UIWebView class). In the view controller class I’ve added the following code, merely as a test before I start working on the actual method:
-(BOOL) webView:(GHWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if (navigationType==UIWebViewNavigationTypeLinkClicked)
{
NSLog(@"Yes!");
}
else
{
NSLog(@"No.");
}
return YES;
}
What I’m trying to do is get “Yes!” logged if the user clicks on a link within the loaded webview. But when the webview loads and I click on a link in it, there’s no NSLog. What should I do differently?
(Thanks in advance for your help and for your patience with somebody who doesn’t yet understand delegates….)
EDIT: Okay, here’s what I think is the relevant code in GHWebView. As of now, in GHWebView.h I declare the properties requ (NSURLRequest), conn (NSURLConnection), and urlData (NSData) as well as a method, -(void)loadWebViewWithbaseURLString:bus withURLString:us. Then in GHWebView.m I define the method:
-(void)loadWebViewWithbaseURLString:bus withURLString:us
{
self.requ = [NSURLRequest requestWithURL:[NSURL URLWithString:us] cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval: 20];
self.conn=[[NSURLConnection alloc] initWithRequest:self.requ delegate:nil];
NSError *error=nil;
NSURLResponse *resp=nil;
if (self.conn)
{
self.urlData = [NSURLConnection sendSynchronousRequest: self.requ returningResponse:&resp error:&error];
NSString *htmlString = [[NSString alloc] initWithData:self.urlData encoding:NSUTF8StringEncoding];
[self loadHTMLString:htmlString baseURL:[NSURL URLWithString:bus]];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] init];
alert.title = @"Unfortunately, I seem to be having a hard time connecting to the Internet. Would you mind trying again later? I'll make it worth your while, I promise.";
[alert show];
}
}
I know that I have to declare a delegate and also add a protocol to my header file — I think it would involve adding code like
@property (nonatomic, assign) id<UIWebViewDelegate> delegate;
@protocol GHWebViewDelegate <UIWebView>
-(void)loadWebViewWithbaseURLString:bus withURLString:us;
@end
But then when I got back to the implementation file and try to replace the selfs with self.delegates in the method -(void)loadWebViewWithbaseURLString:bus withURLString:us, I get property not found on object of type errors. What ought I to do?
You mention you are setting the delegate to the ViewController that is responsible for instantiating the
GHWebViewclass. Whilst that is fine, my question is do you have a section in yourGHWebViewclass where you assign this object as the delegate of theUIWebViewso that it can respond to the-(BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inTypemethod and then call thewebView:(GHWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationTypeso that when this protocol method gets called your delegate (in your case your ViewController) can attend the call?