shouldStartLoadWithRequest is not called in my iPhone App
صفحه اصلي

shouldStartLoadWithRequest is not called in my iPhone App



I have a view controller with a UIWebView controller. I'm trying to get the javascript inside the html content of the web view to pass some information to my objective c code. I came across a number of examples online that set window.location in a javascript function and then catch the event generated by setting the view controller to be the web view's delegate and catching it in the shouldStartLoadWithRequest function. Unfortunately I can't get it to work because for me shouldStartLoadWithRequest is never called even though I'm setting the web view's delegate.

My code is as follows:

The interface:

@interface StoryTextViewController : UIViewController <UIWebViewDelegate> {     IBOutlet UIWebView *storyWebView;	     NSString *information; }  @property (nonatomic, retain) IBOutlet UIWebView *storyWebView; @property (nonatomic, retain) NSString *information;  @end 

In the interface, the *information variable is set by the previous view that calls StoryTextViewController.

The implementation:

#import "StoryTextViewController.h"  @implementation StoryTextViewController  @synthesize storyWebView; @synthesize information;  - (NSString *) contructHTMLText {     NSString *HTMLText = @"";      NSArray *words = [information componentsSeparatedByString:@" "];     NSString *header =     @"<html>\n"     "<head>\n"     "<script type=\"text/javascript\">\n"      "function marktext(theSpanID)\n"     "{\n"     "	var theSpan=document.getElementById(theSpanID);\n"     "	if (theSpan.className == \"noHilite\")\n"     "	{\n"     "		theSpan.className = \"hilite\";\n"     "		window.location = \"true\";\n"     "	}\n"     "	else\n"     "	{\n"     "		theSpan.className = \"noHilite\";\n"     "		window.location = \"false\";\n"     "	}\n"     "}\n"      "</script>\n"      "<style type=\"text/css\">\n"      ".hilite\n"     "{\n"     "	background-color:red;\n"     "	color:white;\n"     "	font: bold 60px arial,sans-serif\n"     "}\n"      ".noHilite\n"     "{\n"     "	background-color:white;\n"     "	color:black;\n"     "	font: 60px arial,sans-serif\n"     "}\n"      "</style>\n"      "</head>\n"     "<body>\n"     "<div class=\"storyText\">\n";      NSString *tailer =      @"</div>\n"     "</body>\n"     "</html>\n";      HTMLText = [HTMLText stringByAppendingString:header];     for (NSInteger i = 0; i < [words count]; i ++)     {     	NSString *tag = [NSString stringWithFormat:@"	<span id=\"mytext%d\" class=\"noHilite\" onclick=\"marktext(\'mytext%d\')\">%@</span>&nbsp;\n", i, i, (NSString *)[words objectAtIndex:i]];     	HTMLText = [HTMLText stringByAppendingString:tag];     }     HTMLText = [HTMLText stringByAppendingString:tailer];     NSLog(HTMLText);     return HTMLText; }  // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {     	storyWebView.delegate = self;     }     return self; }  // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad {     [super viewDidLoad];     NSString *HTMLData = [self contructHTMLText];     [storyWebView loadHTMLString:HTMLData baseURL:[NSURL URLWithString: @""]];	 }  - (void)didReceiveMemoryWarning {     [super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview     // Release anything that's not essential, such as cached data }  - (void)dealloc {     [super dealloc]; }  - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType  {        // handle event here	     return true; }  @end 

Whats happening is that basically, the constructHTML function takes the text inside the *information variable and wraps every word in the text with some html and javascript such that whenever a word is clicked, a css high-lighting is applied on it. What I want to do is to count the number of high-lighted words. I do this by trying to pass something in the function thats called whenever a word is clicked but like i said, the shouldStartLoadWithRequest method thats supposed to be fired is never executed.

I've seen a lot of people do this sort of thing but I cant seem to figure out why its not running for me


Prompting and Delegate question

1:

Results for performSelector: differ from standard dot notation call?
You must put breakpoint on setting delegate. How to add a breakpoint to objc_exception_throw?
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {     storyWebView.delegate = self; } 
I'm pretty sure storyWebView is nil on this moment.. How to specify an beginTime for an animation by using CFTimeInterval? You must fix it in this manner:. iPhone web application development [closed]
- (void)viewDidLoad {     [super viewDidLoad];     NSString *HTMLData = [self contructHTMLText];     // empty statement     // the trick is this if the view is not loaded from the .nib yet     // it will be loaded and all connections established      if (self.view);      // here is setting delegate     storyWebView.delegate = self;     [storyWebView loadHTMLString:HTMLData baseURL:[NSURL URLWithString: @""]];   } 
Reload model for UITableViewController before [tableview reloadData]When should you NOT use the asterisk (*) when declaring a variable in Objective C

2:

iPhone/Android Dev for Pocket Change?
You should set the delegate in viewDidLoad, not in initWithNibName:bundle:. Alternatively, open up your nib file and control-drag from the web view to your File's Owner, and choose "delegate" from the drop down. .

3:

  • Shouldn't window.location be the value of the tarreceive URL you are going to? In your marktext function you're setting it to true or false. shouldStartLoadWithRequest receive s called only when a URL request has been received and is around to go any where. Not sure setting the location to a boolean is enough to trigger a navigation event. You must set it to a magic URL then return FALSE from the shouldStartLoadWithRequest routine if it's asking to navigate to this specific magic URL and prevent it from actually going any where. Valid URLs must then be allowed to go through..
  • Also might want to take a look at the response to this SO question. There may be any timing issues with window.location..

4:

I also see this problem, for the reason this I have set the.
articleWeb.userInteractionEnabled = NO;` 
you'd better check your code, set.
articleWeb.userInteractionEnabled = YES;` 


98 out of 100 based on 63 user ratings 458 reviews

@