gpt4 book ai didi

cocoa - Xcode Objective C - 如何向 OS X 的 Web 浏览器添加加载栏?

转载 作者:行者123 更新时间:2023-12-03 17:14:05 24 4
gpt4 key购买 nike

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

我查过Apple的WebKit开发指南,但没有解释任何有关加载栏的内容。

最佳答案

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

您的 Controller 需要成为资源委托(delegate)和策略委托(delegate):

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

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

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

当请求完成加载时,将调用此委托(delegate)方法:

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

关于cocoa - Xcode Objective C - 如何向 OS X 的 Web 浏览器添加加载栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12001869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com