2

我声明我的应用程序(富文本编辑器)能够打开任何 RTF 文件(例如,来自电子邮件附件)。当用户选择附件时,应用程序委托向 UiwebView 控制器发送“loadContent: (NSURL *) url”消息。在接收器中,我获取 url 并使用 UIWebView 加载 RTF 文件

- (void) loadContent: (NSURL *) passedURL
{
    if (passedURL) { 
        [self.myWebView loadRequest:[NSURLRequest requestWithURL:passedURL]];
    } else {
        NSBundle *bundle = [NSBundle mainBundle];
        NSURL *indexFileURL = [bundle URLForResource:@"index" withExtension:@"html"];
        [self.myWebView loadRequest:[NSURLRequest requestWithURL:indexFileURL]];

    }
}

这样做,一切顺利,“myWebView”显示 RTF 文件的内容。问题是这个视图应该是内容可编辑的,并且代码应该包含我在“index.html”捆绑文件中的一些javascript。我在启动应用程序时加载。所以我添加了一些代码来提取从 RTF 文件创建的 HTML 代码,以便以后能够重新创建完整的代码,将提取的代码插入到这样的标签中:

<div id="content" contenteditable="true"> imported html from rtf should be there</div>

我修改了 loadContent 方法来获得它。

- (void) loadContent: (NSURL *) passedURL
{
    if (passedURL) { 
        [self.myWebView loadRequest:[NSURLRequest requestWithURL:passedURL]];
        NSString *dum=[self.myWebView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML;"];
        NSLog(@"%@",dum);
    } else {
        NSBundle *bundle = [NSBundle mainBundle];
        NSURL *indexFileURL = [bundle URLForResource:@"index" withExtension:@"html"];
        [self.myWebView loadRequest:[NSURLRequest requestWithURL:indexFileURL]];

    }
}

查看 NSLog 的结果,我只得到以下 html

<div id="content" contenteditable="true">Hello folks</div>

在我加载 rtf 文件之前,这是 myWebView 的 HTML 内容...

你知道发生了什么吗?为什么dum显示以前的代码,而显示的 myWebView 显示的是新的?是不是因为loadRequest是在单独的线程中执行的,在执行下一条指令时,myWebView还包含之前的代码?

谢谢

[编辑] 我也尝试在 webViewDidFinishLoad: 委托方法中对 webView 的内容进行 NSLog 记录,但得到相同的结果:在我打开 RTF 附件文件之前这个 webView 的内容。是否可以以同步方式发出加载请求?

4

1 回答 1

2

这是因为 loadRequest 是异步的。在尝试该 NSLog 之前,您需要等待加载完成。查看UIWebViewDelegate文档。在 webViewDidFinishLoad: 内部/之后尝试 NSLog:你应该会得到更好的结果。

于 2012-04-20T23:21:07.500 回答