0

我在 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]]; 
}

我已经看过这个答案了,这对我来说毫无意义。

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

4

6 回答 6

2

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

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

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

于 2012-09-11T09:10:37.230 回答
1

尽量避免在其他方法中等待代表和通知——当他们回调你的班级时,做依赖于他们的工作。myMethod在收到代表消息之前不要打电话。如果myMethod从用户输入调用,则禁用关联的控件,直到加载 Web 视图。

于 2012-09-11T12:49:23.493 回答
0
  • 你可以使用UIWebView's iVarloading
  • 您可以使用自己的共享布尔标志作为 iVar 并将其设置为webViewDidFinishLoad.

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

于 2012-09-11T09:06:26.260 回答
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

    });
});
于 2012-09-11T09:11:39.173 回答
0

使用布尔值并将其值设置YESwebViewDidFinishLoad.

然后myMethod像这样签入:

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

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

那应该做你的工作。

于 2012-09-11T09:11:43.257 回答
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];
}
于 2012-09-11T09:14:56.833 回答