Xcode目标C - 如何在OS X的Web浏览器中添加加载栏?

时间:2012-08-17 07:51:52

标签: cocoa webkit loading

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

我查看了Apple的WebKit开发指南,但没有解释任何关于加载条的内容。

2 个答案:

答案 0 :(得分:1)

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

您的控制器需要是资源委托和策略委托:

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

确保网址字段与网页的网址相同。我们稍后会用它进行跟踪。

- (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];
}

答案 1 :(得分:0)

Apple有一个示例,说明如何在此页面上加载资源时跟踪资源。

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

您可以使用这些数字来设置进度条,而不是打印掉多少资源。

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