2010-05-06 4 views
1

Я нахожу странное поведение UIWebView.UIWebView и JavaScript

В делегатом

- (void)webViewDidFinishLoad:(UIWebView *)webView{  
    [self changeFont];  
    //[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changeFont) userInfo:nil repeats:NO]; 
} 

В changeFont, я звоню JavaScript, чтобы изменить шрифт веб-страницы. Он не будет применен, но если я вызову метод изменения шрифта после задержки в несколько секунд от делегата webViewDidFinishLoad, он будет применен. , если файлы большие, как мы можем определить, сколько времени займет веб-просмотр для загрузки, если нам нужно запустить таймер из делегата webViewDidFinish, чтобы применить размер шрифта и стиль для файла.

любые объяснения для этого. Я много сел, и ничего не упоминается в документах.

Любая помощь, почему такое поведение UIWebView?

+0

Является ли это возможно [стреляя более чем один раз] (http://stackoverflow.com/questions/1842370/uiwebview-didfinishloading- пожары многодисковые раз)? –

+0

Нет, он не стреляет более одного раза. Он стреляет только один раз. Мой вопрос в том, почему делегат вызывается, когда контент в приемнике все еще загружается.когда получатель получает содержимое, необходимо вызвать webViewDidFinishLoad. В webViewDidFinishLoad я проверил так: if (myWebView.loading == YES) {NSlog (@ "по-прежнему загружается");} и журнал печатается на консоли, это означает, что веб-представление не загружается и вызывается делегат. – ashish

ответ

0

Попробуйте вызвать метод changeFont в основном потоке. Как [self performSelectorInMainThread: ...];

0

Я думаю, это потому, что веб-страница не может быть полностью оказанные (я имею в виду все JavaScript, ресурсы и т.д.) в тот момент, когда - (void)webViewDidStartLoad:(UIWebView *)webView метод выстрелил

Это объясняет, почему ваш метод работает второй раз после некоторой задержки. . (страница полностью загружена)

Вы можете использовать обратный вызов от javascript к объекту-c, чтобы определить процесс рендеринга завершен или нет, дополнительную информацию об этой функции (или маленьком взломе) вы можете найти в разделе: «Javascript связь с кодом Objective-C "по ссылке http://www.codingventures.com/2008/12/using-uiwebview-to-render-svg-files/.

или использовать stringByEvaluatingJavaScriptFromString: - я привел пример использования его в другой соответствующей теме https://stackoverflow.com/a/8560489/857417

1

Документ от Apple объясняет, что webViewDidFinishLoad и webViewDidStartLoad будет вызываться после завершения/запуска загрузки кадр
Таким образом, после webViewDidFinishLoad (при загрузке базового html) на странице, которая все еще выполняется, может быть JavaScript или Ajax. Вам нужно дождаться, когда все они будут выполнены.

Я хотел бы предложить два способа попытаться:

  1. добавить наблюдатель UIWebView в погрузочной собственность
  2. связывания пользовательских JavaScript на страницу, чтобы судить о событии вы хотите действительно СЛУЧИЛИСЬ (например, все элементы сделали нагрузку) , затем используя JavaScript для обратного вызова к Objective-C

более поздний более мощный при работе с пользовательскими событиями. И этот вопрос я ответил, может помочь:

  1. detect YouTube Player event and callback using UIWebView
  2. Javascript callback in Objective-C
Смежные вопросы