當(dāng)在一個頁面觸發(fā)一個事件跳轉(zhuǎn)到一個H5頁面時,H5頁面內(nèi)部也可以進行下一級的跳轉(zhuǎn),這個時候我們導(dǎo)航欄使用蘋果原生的返回按鈕就需要處理頁面中的返回效果街立。是返回到pushH5的上一級頁面還是返回H5內(nèi)部的上一級頁面?
- (void)viewDidLoad {? ? [superviewDidLoad];UIButton* backButton = [UIButtonbuttonWithType:UIButtonTypeSystem];? ? backButton.frame= CGRectMake(10,20,20,20);? ? [backButton setBackgroundImage:[UIImageimageNamed:@"goBackImage"] forState:UIControlStateNormal];? ? [backButton addTarget:selfaction:@selector(back:) forControlEvents:UIControlEventTouchUpInside];self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithCustomView:backButton];self.webView=[[UIWebViewalloc]initWithFrame:CGRectMake(0,0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];? ? _webView.backgroundColor= [UIColorclearColor];for(UIView* views in [self.webViewsubviews]) {if([views isKindOfClass:[UIScrollViewclass]]) {//去掉水平方向的滑動條[(UIScrollView*)views setShowsHorizontalScrollIndicator:NO];//去掉垂直方向的滑動條[(UIScrollView*)views setShowsVerticalScrollIndicator:NO];for(UIView* inScrollView in views.subviews) {if([inScrollView isKindOfClass:[UIImageViewclass]]) {//隱藏上下滾動出邊界時的黑色的圖片inScrollView.hidden=YES;? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }? ? }NSString* urlString = [NSStringstringWithFormat:@"%@xxxxxxxx",BASE_URL];NSURL* url = [NSURLURLWithString:urlString];NSURLRequest* request = [NSURLRequestrequestWithURL:url];? ? _webView.delegate=self;? ? [_webView loadRequest:request];? ? [self.viewaddSubview:self.webView];}//用蘋果自帶的返回鍵按鈕處理如下(自定義的返回按鈕)- (void)back:(UIBarButtonItem*)btn{if([self.webViewcanGoBack]) {? ? ? ? [self.webViewgoBack];? ? }else{? ? ? ? [self.viewresignFirstResponder];? ? ? ? [self.navigationControllerpopViewControllerAnimated:YES];? ? }}//如果是H5頁面里面自帶的返回按鈕處理如下:#pragma mark - webViewDelegate- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {NSString* requestString = [[request URL] absoluteString];? ? requestString = [requestString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//獲取H5頁面里面按鈕的操作方法,根據(jù)這個進行判斷返回是內(nèi)部的還是push的上一級頁面if([requestString hasPrefix:@"goback:"]) {? ? ? ? [self.navigationControllerpopViewControllerAnimated:YES];? ? }else{? ? ? ? [self.webViewgoBack];? ? }returnYES;}//獲取當(dāng)前頁面的title和url- (void)webViewDidFinishLoad:(UIWebView*)webView{? ? [SVProgressHUD dismiss];NSString* title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];//獲取當(dāng)前頁面的titleself.title= title;//獲取當(dāng)前網(wǎng)頁的htmlself.currentURL= webView.request.URL.absoluteString;NSLog(@"title-%@--url-%@--",self.title,self.currentURL);NSString*lJs = @"document.documentElement.innerHTML";self.currentHTML= [webView stringByEvaluatingJavaScriptFromString:lJs];}
從native直接push到一個webView頁面垛孔,隱藏navigationBar逾苫,使用H5的頭部為導(dǎo)航欄趟咆。此時會出現(xiàn)一個問題呵扛,就是push出的這個webview沒有了原生的navigationBar电湘,那么在點擊H5頁面上的返回按鈕時怎么pop到之前的頁面呢隔节?
當(dāng)然万搔,我們可以使用上一遍博客提到的利用webViewjavascriptBridge的第三方來解決,這就需要H5和nativ相配合官帘,如果h5是另一個團隊做的瞬雹,那么解決這么一個簡單的問題確實顯得有點小題大做。
所以可以使用一種更簡單的方法刽虹,利用webView 的delegate方法來控制pop到H5頁面還是Native頁面酗捌。
由于系統(tǒng)尚且要兼容iOS7,加上還涉及到native向webView寫cookie的問題涌哲,而WKWebView貌似只支持在iOS8以上使用胖缤,在cookie處理和緩存處理方面會有比較大的坑,所以項目中依舊使用的是UIWebView阀圾。在webView的代理方法中添加如下代碼:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{if(navigationType==UIWebViewNavigationTypeBackForward) {self.webView.canGoBack?[self.webViewgoBack]:[self.navigationControllerpopViewControllerAnimated:YES];? ? }returnYES;}
這樣就可以區(qū)分返回native還是H5
補充:
以上適用整個頁面都是H5的頁面
如果只有navigationBar是原生的哪廓,此時應(yīng)該重寫pop事件:如下
-(void)navigationBarItemBackImage{UIImage*image=[UIImageimageNamed:@"navigationBack"];if([PSBTools systemVersion]>=7) {? ? ? ? image= [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];? ? }self.navigationItem.leftBarButtonItem=[[UIBarButtonItemalloc]initWithImage:image style:UIBarButtonItemStyleDonetarget:selfaction:@selector(goBackAction)];}-(void)goBackAction{if(self.webView.canGoBack==YES) {? ? ? ? [self.webViewgoBack];? ? }else{? ? ? ? [self.navigationControllerpopViewControllerAnimated:YES];? ? }}