1

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?

Joel Derfner
  • 2,207
  • 6
  • 33
  • 45

1 Answers1

1

You mention you are setting the delegate to the ViewController that is responsible for instantiating the GHWebView class. Whilst that is fine, my question is do you have a section in your GHWebView class where you assign this object as the delegate of the UIWebView so that it can respond to the -(BOOL)webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType method and then call the webView:(GHWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType so that when this protocol method gets called your delegate (in your case your ViewController) can attend the call?

El Developer
  • 3,345
  • 1
  • 21
  • 40
  • No, I don't! So far in my very limited experience I've only assigned delegates in parent classes, not child classes, so I'm a little bit at sea--I know a little, but that, as we and Alexander Pope know, is a dangerous thing. I'm going to edit my question to show you what I DO know, or what I think I know, in the hope that you'll correct my errors and fill in the gaps in my understanding. Thank you so very much for your help. – Joel Derfner Aug 21 '12 at 05:09
  • One thing that I notice from the code you added to your question is: Your property called delegate is of type `UIWebView` what you want there is to be of type `GHWebView` as it will be the delegate responsible of the protocols of this class. You will probably want to take a look at this question: http://stackoverflow.com/questions/626898/how-do-i-create-delegates-in-objective-c – El Developer Aug 23 '12 at 02:02
  • Thanks very much--both for noticing what you noticed and for pointing me to that helpful question/answer! – Joel Derfner Aug 24 '12 at 00:42