У меня есть контроллер представления с контроллером UIWebView. Я пытаюсь получить javascript внутри html-содержимого веб-представления, чтобы передать некоторую информацию моему целевому коду c. Я столкнулся с рядом примеров в Интернете, которые устанавливают window.location в функции javascript, а затем перехватывают событие, сгенерированное путем установки контроллера представления в качестве делегата веб-представления и перехвата его в функции shouldStartLoadWithRequest. К сожалению, я не могу заставить его работать, потому что для меня shouldStartLoadWithRequest никогда не вызывается, даже если я устанавливаю делегат веб-представления.
Мой код выглядит следующим образом:
Интерфейс:
@interface StoryTextViewController : UIViewController <UIWebViewDelegate>
{
IBOutlet UIWebView *storyWebView;
NSString *information;
}
@property (nonatomic, retain) IBOutlet UIWebView *storyWebView;
@property (nonatomic, retain) NSString *information;
@end
В интерфейсе переменная *information задается предыдущим представлением, которое вызывает StoryTextViewController.
Реализация:
#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> \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
Происходит то, что в основном функцияstructHTML берет текст внутри переменной *information и оборачивает каждое слово в тексте некоторым html и javascript, так что всякий раз, когда слово нажимается, к нему применяется подсветка css. Что я хочу сделать, так это подсчитать количество выделенных слов. Я делаю это, пытаясь передать что-то в функцию, которая вызывается всякий раз, когда щелкают слово, но, как я уже сказал, метод shouldStartLoadWithRequest, который должен запускаться, никогда не выполняется.
Я видел, как многие люди делают подобные вещи, но я не могу понять, почему это не работает для меня.