iOS如何判断webViewDidFinishLoad何时完成?

时间:2012-09-11 09:00:09

标签: ios uiwebview

我在webViewDidFinishLoad委托方法中有一些代码,我需要一些方法来告诉这段代码已完成从我的代码完全不同的部分中的另一个方法执行。这可能吗?基本上我想做的是这样的事情:

-(void) myMethod
{
    // do stuff that causes webViewDidFinishLoad to be called

    if (webViewDidFinishLoad has finished executing)
    {
        // do stuff with outputString
    }
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    outputString = [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"myJSFunction('%@')",jsInputString]]; 
}

我已经看了this answer,这对我来说毫无意义。

我应该在myMethod中添加,我可以确定webViewDidFinishLoad只会被调用一次。

6 个答案:

答案 0 :(得分:2)

您始终可以设置布尔值以指示webview是否已完成加载。 并且将在webview委托方法中更改布尔值:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    loadFinished = YES;
}

然后在您自己的方法中,选中“loadFinished”将执行该任务。 您必须为接口设置<UIWebViewDelegate>才能使用此委托方法

答案 1 :(得分:1)

尽量避免在其他方法中等待代理和通知 - 在回调课程时执行依赖于他们的工作。在收到委托消息之前,请不要致电myMethod。如果从用户输入调用myMethod,请在加载Web视图之前禁用关联的控件。

答案 2 :(得分:0)

  • 您可以使用UIWebView的iVar loading
  • 您可以将自己的共享布尔标志用作iVar,并将其设置为webViewDidFinishLoad

但是,也许您可​​以重新考虑您的设计并在webViewDidFinishLoad完成加载后的操作。

答案 3 :(得分:0)

为什么不试试GCD?

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // WebView load content here 

    dispatch_async( dispatch_get_main_queue(), ^{

       // load myMethod

    });
});

答案 4 :(得分:0)

使用布尔值并在YES的最后一行将其值设置为webViewDidFinishLoad

然后像这样检查你的myMethod

-(void) myMethod
{
    // do stuff that causes webViewDidFinishLoad to be called

  if (yourBoolean == YES)
  {
      // do more stuff
  }
}  

应该做你的工作。

答案 5 :(得分:0)

在webViewDidFinishLoad中,您向“myMethod”代码部分发布通知。 像这样:

UIWebView中的

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"webview_finished" object:self userInfo:nil];
}

在“myMethod”代码部分中:

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMethod) name:@"webview_finished" object:nil];
}