這段時間在開發(fā)一個應(yīng)用,其中大部分頁面是加載Web頁面,而UINavigationController原生框架的標(biāo)題是根據(jù)頁面加載結(jié)束,回調(diào)UIWebViewDelegate的時候獲取的,示例代碼如下。
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
大部分Web頁面跳轉(zhuǎn)頁面的時候都是重新加載URL,從而會觸發(fā)UIWebViewDelegate回調(diào)。
問題來了,如果是Vue單頁應(yīng)用呢?因為Vue在加載時會一次性加載所有內(nèi)容,而在該頁面操作跳轉(zhuǎn)都不需要重新加載URL,就不會觸發(fā)UIWebViewDelegate回調(diào)。
可是如果我們還是需要在每次切換頁面的時候獲取Web信息時該怎么辦呢,顯然從UIWebViewDelegate回調(diào)中獲取是不可能的了。在網(wǎng)上搜索了一下,基本的辦法都是讓W(xué)eb開發(fā)修改代碼或者增加Schema調(diào)用。
辦法總是有的,畢竟Web頁面是運行在原生上,如果原生都無法解決這問題,還怎么混下去。
現(xiàn)在說一下我的解決辦法,用幀刷新回調(diào)!
因為我這里的需求就是獲取Web頁面的標(biāo)題和加載情況等,所以我可以在每一幀的回調(diào)中獲取Web頁面的狀態(tài)(這里就不要用定時器了,你確定每秒執(zhí)行一次?看看CPU占用率?。?br>
直接上代碼吧
@interface WebViewController ()<UIWebViewDelegate>
@property(nonatomic, retain) UIWebView *webView;
@property(nonatomic, retain) CADisplayLink *displayLick;
@end
@implementation WebViewController
- (void) viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if(_displayLick == nil){ // 初始化幀回調(diào)
_displayLick = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink)];
}
[_displayLick addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // 因為viewWillAppear是在主線程里面執(zhí)行的,所以是添加到主線程的RunLoop。
}
- (void) viewDidDisappear:(BOOL)animated
{
if(_displayLick != nil){ // 跳轉(zhuǎn)到其他頁面就把幀回調(diào)移除
[_displayLick removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
}
- (void) handleDisplayLink
{
self.navigationItem.title = [_webView stringByEvaluatingJavaScriptFromString:@"document.title"]; // 獲取標(biāo)題
_webView.isLoading; // 是否正在加載
}
@end