我使用UIWebView来呈现数据,并使用微调器来显示加载过程。数据是我服务器的.mp3文件。
我开始加载webView时启动微调器。然后有一段延迟,直到音频文件开始播放。那时我需要停止旋转器。
非常重要,但以防万一 - 加载代码:
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://blablabla.mp3"]]];
问题:当webView准备播放音频时(如果有足够的数据开始播放),我怎么能抓住这个事件?我需要它来阻止微调器。
WebViewDidFinishLoad是我可以使用的唯一委托方法,它对我不利,因为它会在加载所有数据时通知。即使我使用它,当音频文件完成加载时也不会被调用(可能它没有完成,我不知道,我只是看到加载进度在mp3正在播放时结束)。以防万一 - 错误:
Error Domain=NSURLErrorDomain Code=-999
"The operation couldn’t be completed. (NSURLErrorDomain error -999.)"
UserInfo=0x1d39d0 {NSErrorFailingURLKey=http://blablabla.mp3,
NSErrorFailingURLStringKey=http://blablabla.mp3}
感谢任何帮助/ tut /链接。提前谢谢!
答案 0 :(得分:2)
对于那种控制我不建议通过webView进行 - 你无法达到那种级别的交互。
答案 1 :(得分:0)
您可以尝试非常受欢迎的ASIHTTPRequest课程。
有一个[didReceiveData:]委托,可能适合你的测试。
答案 2 :(得分:0)
别担心这很容易!
WebView的-999是一个正常错误,适用于加载其他内容而不让页面真正完全加载。
所以必须这样做:
if([error code] != NSURLErrorCancelled) return;
到你的javascript事件检测:
执行JS的Objective-C方法
遗憾的是,这有点复杂,因为Mac OSX上不存在相同的windowScriptObject属性(和类),允许两者之间完全通信。
但是,您可以通过javascript自定义网址轻松调用,例如:
window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value
加载jquery库并使用document.ready事件:
$(document).ready(function() {
window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value
});
用Objective-C拦截它:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"yourscheme"]) {
// parse the rest of the URL object and execute functions
}
}
这不像应该的那样干净(或使用windowScriptObject),但它可以工作。
上一个解决方案:
Javascript Bridge https://github.com/marcuswestin/WebViewJavascriptBridge
享受
答案 3 :(得分:0)
不使用iOS活动指示器,而是在html中实现活动指示器。它更简单的结束也是优雅的解决方案。只需使用javascript显示/隐藏带有动画gif图像的html元素。
答案 4 :(得分:0)
使用单独的类来管理NSUrlConnection以检索和存储.mp3文件。您可以使用NSNotificationCenter和postNotification消息或代表来准备播放文件