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 self
s with self.delegate
s in the method -(void)loadWebViewWithbaseURLString:bus withURLString:us
, I get property not found on object of type
errors. What ought I to do?