2012-08-17 42 views
1

我正在制作一个网页浏览器。创建了一个URL文本栏和一个WebView。但我一直想知道如何制作一个进度/加载栏,告诉用户网页加载了多少,我该怎么做?Xcode Objective C - 如何在OS X的Web浏览器中添加加载栏?

我检查了Apple的WebKit开发指南,但没有解释关于加载酒吧的任何事情。

+0

iOS或OS X ... – 2012-08-17 11:28:47

回答

0

苹果有一个关于如何跟踪资源的例子,因为他们加载在这个页面上。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DisplayWebContent/Tasks/ResourceLoading.html#//apple_ref/doc/uid/20002028-CJBEHAAG

,而不是打印出来有多少资源被排除在外的有多少,你可以用数字来设置一个进度条。

顺便说一句:这个计数似乎是唯一的方式来判断一个给定的页面/ URL是否真的完成加载。

0

这是一个工作实现,假设您有一个用于Web视图的@property,一个URL文本字段和一个进度指示器。

你的控制器需要是资源代表和政策代表:

- (void)awakeFromNib 
{ 
    self.webView.resourceLoadDelegate = self; 
    self.webView.policyDelegate = self; 
} 

确保URL字段具有相同的URL页面。我们稍后使用它进行跟踪。

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id<WebPolicyDecisionListener>)listener 
{ 
    self.urlField.stringValue = request.URL.absoluteString; 

    [listener use]; 
} 

检测页面何时开始加载。

- (id)webView:(WebView *)sender identifierForInitialRequest:(NSURLRequest *)request fromDataSource:(WebDataSource *)dataSource 
{ 
    if ([request.URL.absoluteString isEqualToString:self.urlField.stringValue]) { 
    [self.loadProgress setIndeterminate:YES]; 
    [self.loadProgress startAnimation:self]; 
    } 
    return [[NSUUID alloc] init]; 
} 

这将在新数据进入时调用。请注意,“length”参数是在此数据块中接收到的长度的数量。您需要使用dataSource来查找到目前为止收到的实际金额。另外请注意,大多数Web服务器(如几乎所有动态网页)都不会返回内容长度标题,因此您必须大胆猜测。

- (void)webView:(WebView *)sender resource:(id)identifier didReceiveContentLength:(NSInteger)length fromDataSource:(WebDataSource *)dataSource 
{ 
    // ignore requests other than the main one 
    if (![dataSource.request.URL.absoluteString isEqualToString:self.urlField.stringValue]) 
    return; 

    // calculate max progress bar value 
    if (dataSource.response.expectedContentLength == -1) { 
    self.loadProgress.maxValue = 80000; // server did not send "content-length" response. Pages are often about this size... better to guess the length than show no progres bar at all. 
    } else { 
    self.loadProgress.maxValue = dataSource.response.expectedContentLength; 
    } 
    [self.loadProgress setIndeterminate:NO]; 

    // set current progress bar value 
    self.loadProgress.doubleValue = dataSource.data.length; 
} 

当请求完成加载此委托方法被称为:

- (void)webView:(WebView *)sender resource:(id)identifier didFinishLoadingFromDataSource:(WebDataSource *)dataSource 
{ 
    // ignore requests other than the main one 
    if (![dataSource.request.URL.absoluteString isEqualToString:self.urlField.stringValue]) 
    return; 

    [self.loadProgress stopAnimation:self]; 
}