之前的想法是通過webview的navigationDelegate的各個(gè)生命周期中,判斷webview的canGoBack屬性,但是有不少缺陷:
比如單頁應(yīng)用的跳轉(zhuǎn)不會(huì)觸發(fā)生命周期,如果在didFinishNavigation中判斷canGoBack,這要等頁面加載完成才會(huì)執(zhí)行,有很大的延遲.
下面是解決方案,其實(shí)很簡(jiǎn)單,就是通過kvo來監(jiān)聽canGoBack的變化:
[_webView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
...
//WkWebView的 回調(diào)
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)objectchange:(NSDictionary*)change context:(void*)context{
if([keyPath isEqualToString:@"canGoBack"]) {
[self configLeftItem];
}
}
- (void)configLeftItem {
if ([self.webView canGoBack]) {
UIBarButtonItem *backItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon_common_back"] style:UIBarButtonItemStylePlain target:self action:@selector(pop)];
UIBarButtonItem *closeItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon_common_blackClose"] style:UIBarButtonItemStylePlain target:self action:@selector(close)];
self.navigationItem.leftBarButtonItem=nil;
self.navigationItem.leftBarButtonItems=@[backItem,closeItem];
}else {
self.navigationItem.leftBarButtonItems=nil;
UIBarButtonItem *backItem=[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"icon_common_back"] style:UIBarButtonItemStylePlain target:self action:@selector(pop)];
self.navigationItem.leftBarButtonItem=backItem;
}
}
-(void)pop{
if([self.webView canGoBack]) {
[self.webView goBack];
}else {
[self.navigationController popViewControllerAnimated:YES];
}
}
-(void)close{
[self.navigationController popViewControllerAnimated:YES];
}
- (void)dealloc {
if(self.viewLoaded)
{
[self.webView removeObserver:self forKeyPath:@"canGoBack"];
}
}
根據(jù)微信的體驗(yàn),微信的底部前進(jìn)后退的狀態(tài)判斷也是根據(jù)監(jiān)聽canGoBack canGoForward來動(dòng)態(tài)配置的