我使用 UIWebView 在我的应用程序中显示 html 内容,该应用程序包含两个箭头来在主题之间导航,就像 RSS 阅读器应用程序一样,但是当用户点击向上或向下箭头时,下一个主题不会显示,直到数据到来返回,用户仍然可以与 UI 交互,这有点令人困惑,
我的问题:当用户移动到下一个/后退主题时如何阻止用户界面?换句话说,如何使 loadHTMLString:baseURL: 作为同步调用工作?谢谢 !
我使用 UIWebView 在我的应用程序中显示 html 内容,该应用程序包含两个箭头来在主题之间导航,就像 RSS 阅读器应用程序一样,但是当用户点击向上或向下箭头时,下一个主题不会显示,直到数据到来返回,用户仍然可以与 UI 交互,这有点令人困惑,
我的问题:当用户移动到下一个/后退主题时如何阻止用户界面?换句话说,如何使 loadHTMLString:baseURL: 作为同步调用工作?谢谢 !
您可以让加载异步发生,但将 Web 视图的 userInteractionEnabled 属性设置为 NO。(然后在 didFinishLoad 回调中返回 YES)。
或者,您可以在 Web 视图上方放置一个清晰的彩色视图(将 userInteractionEnabled 设置为 NO),该视图有一个活动指示器和按钮,可以让用户取消加载。
一个更好的主意是在屏幕外放置另外两个 Web 视图并开始为页面 N-1 和 N+1 加载它们。当用户按下页面箭头时,将框架与相应的预取 Web 视图交换。
If you are in a pinch and have a UIPageViewController and still want to use a UISynchedWebView to ensure that a page has loaded before you run javascript, you can run a block on the main thread's event queue. Still has a slight delay while the javascript runs but won't cause recursion in the run loop.
dispatch_async(dispatch_get_main_queue(), ^{
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://google.com"]]]; // self.webView is a UISynchedWebView
NSLog(@"url:%@", [self.webView stringByEvaluatingJavaScriptFromString:@"window.location.href;"]); // shows google.com instead of about:blank
});
您实际上并不想阻止 UI。如果你这样做了,一旦你将它发送到应用商店提交,Apple 很有可能会拒绝你的应用。任何使应用程序感觉迟钝的远程操作都会给您带来沉重的负担。相反,使用 GCD 或 performSelectorInBackground 创建一个后台线程,在其中处理您的加载,然后一旦加载完成,立即将所有信息提供给您的 UIWebView 并提醒它呈现显示。