在iOS開發(fā)中斥扛,不免有原生與H5的交互入问,比如說:從原生頁面的一個(gè)按鈕丹锹,點(diǎn)擊之后跳轉(zhuǎn)到了一個(gè)H5的頁面A稀颁,A頁面中又有一個(gè)按鈕,點(diǎn)擊之后楣黍,又加載了一個(gè)新的H5頁面B匾灶,從B點(diǎn)擊一個(gè)按鈕,又加載一個(gè)新的H5頁面C租漂,如果此時(shí)我們點(diǎn)擊左上角的返回按鈕阶女,會(huì)直接返回到我們的原生頁面颊糜。這樣的話,用戶的體驗(yàn)很不好秃踩,我們需要對(duì)WebView進(jìn)行添加按鈕事件的處理衬鱼。
此時(shí),想要重新定制返回按鈕憔杨,想要從C頁面判斷是否還有上一級(jí)H5頁面可供返回鸟赫,如果有上一級(jí)頁面還是H5,點(diǎn)擊左上角的返回則返回到B頁面消别,并且在B頁面的左上角加上一個(gè)關(guān)閉按鈕抛蚤,這個(gè)關(guān)閉按鈕的作用主要是為了關(guān)閉所有的H5的頁面,直接返回到原生的頁面寻狂;如果不點(diǎn)擊關(guān)閉按鈕岁经,還是點(diǎn)擊返回,則從B頁面返回到A頁面蛇券;再次點(diǎn)擊返回缀壤,則關(guān)閉了H5的頁面,回到了原生的頁面纠亚。
首先是初始化一個(gè)WebView:
@property (nonatomic,strong,readwrite) UIWebView *announceWebView;
- (UIWebView *)announceWebView {
? ? if (!_announceWebView) {
? ? ? ? _announceWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, deviceScreenWidth, deviceScreenHeight)];
? ? ? ? _announceWebView.backgroundColor = MAIN_VIEW_COLOR;
? ? ? ? _announceWebView.scalesPageToFit = YES;
? ? ? ? _announceWebView.allowsInlineMediaPlayback = YES;
? ? ? ? _announceWebView.mediaPlaybackRequiresUserAction = YES;
? ? ? ? [self.view addSubview:self.announceWebView];
? ? }
? ? return _announceWebView;
}
其次诉位,在導(dǎo)航欄的左邊添加一個(gè)自定義返回按鈕和關(guān)閉按鈕:
@property (nonatomic,strong,readwrite) UIBarButtonItem *returnButton;@property (nonatomic,strong,readwrite) UIBarButtonItem *closeItem;
- (UIBarButtonItem *)returnButton {
? ? if (!_returnButton) {
? ? ? ? _returnButton = [[UIBarButtonItem alloc] init];
? ? ? ? UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
? ? ? ? UIImage *image = [UIImage imageNamed:@"fanhui.png"];
? ? ? ? [button setImage:image forState:UIControlStateNormal];//這是一張“<”的圖片? ? ? ? [button setTitle:@" 返回" forState:UIControlStateNormal];
? ? ? ? [button addTarget:self action:@selector(respondsToReturnToBack:) forControlEvents:UIControlEventTouchUpInside];
? ? ? ? [button.titleLabel setFont:[UIFont systemFontOfSize:17]];
? ? ? ? [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
? ? ? ? [button sizeToFit];
? ? ? ? button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
? ? ? ? button.contentEdgeInsets = UIEdgeInsetsMake(0, -15, 0, 0);
? ? ? ? button.frame = CGRectMake(20, 0, 40, 40);
? ? ? ? _returnButton.customView = button;
? ? ? ? self.navigationItem.leftBarButtonItem = _returnButton;
? ? }
? ? return _returnButton;
}
- (UIBarButtonItem *)closeItem {
? ? if (!_closeItem) {
? ? ? ? _closeItem = [[UIBarButtonItem alloc] initWithTitle:@"關(guān)閉" style:UIBarButtonItemStyleDone target:self action:@selector(respondsToReturnToFind:)];
? ? }
? ? return _closeItem;
}
兩個(gè)按鈕的點(diǎn)擊事件處理
- (void)respondsToReturnToBack:(UIButton *)sender {
? ? if ([self.announceWebView canGoBack]) {//判斷當(dāng)前的H5頁面是否可以返回? ? //如果可以返回,則返回到上一個(gè)H5頁面菜枷,并在左上角添加一個(gè)關(guān)閉按鈕? ? ? ? [self.announceWebView goBack];
? ? ? ? self.navigationItem.leftBarButtonItems = @[self.returnButton, self.closeItem];
? ? } else {
? ? //如果不可以返回苍糠,則直接:? ? ? ? [self.navigationController popViewControllerAnimated:YES];
? ? }
}
- (void)respondsToReturnToFind:(UIBarButtonItem *)sender {
? ? [self.navigationController popViewControllerAnimated:YES];
}
最后再用[self.announceWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:API_URL_ANNOUNCEMENT]]]加載出WebView界面內(nèi)容以及實(shí)現(xiàn)相關(guān)的代理即可。