You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS WebView加载PDF后如何添加返回/关闭按钮?

在iOS WebView中打开PDF时添加返回/关闭按钮的解决方案

嘿,我明白你在用UIWebView打开PDF时遇到了没法返回或关闭窗口的麻烦,下面给你一套实用的解决方案,通过监听WebView的加载状态,动态添加返回按钮来解决这个问题:

核心思路

我们需要先判断当前加载的资源是否是PDF文件,然后在WebView加载完成后,根据判断结果动态显示或隐藏返回按钮;同时实现按钮的点击逻辑,让用户可以返回上一页或者退出当前页面。

具体实现步骤

1. 声明全局变量(在控制器头文件中)

首先在HomeController.h中添加一个BOOL类型的全局变量,用来标记当前是否加载PDF文件:

@property (nonatomic, assign) BOOL isPdf;

2. 初始化WebView并设置代理

在viewDidLoad方法中,先给WebView设置代理(这样才能监听加载完成事件),然后判断目标URL是否指向PDF文件,再加载请求:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 设置WebView代理,用于监听加载状态
    myWebView.delegate = self;
    
    NSURL *myURL = [NSURL URLWithString:@"http://test.mysite.com"];
    // 修正:通过pathExtension获取文件后缀,判断是否为PDF(原代码直接比较lastPathComponent会出错)
    _isPdf = [[myURL.pathExtension isEqualToString:@"pdf"]];
    
    NSURLRequest *myRequest = [NSURLRequest requestWithURL:myURL];
    [myWebView loadRequest:myRequest];
    
    NSLog(@"Run WebView with the URL");
}

3. 加载完成后动态添加返回按钮

实现webViewDidFinishLoad代理方法,当WebView加载完成后,根据isPdf的值来显示或隐藏返回按钮:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (_isPdf) {
        // 创建返回按钮,设置点击事件
        UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                                                       style:UIBarButtonItemStyleDone 
                                                                      target:self 
                                                                      action:@selector(backButtonPressed)];
        self.navigationItem.rightBarButtonItem = backButton;
        NSLog(@"Show back button %i", _isPdf);
    } else {
        // 非PDF页面,隐藏按钮
        self.navigationItem.rightBarButtonItem = nil;
        NSLog(@"Not show back button %i", _isPdf);
    }
}

4. 实现返回按钮的点击逻辑

编写按钮的点击事件方法,先判断WebView是否可以返回上一页,如果可以则返回,否则退出当前控制器:

-(void)backButtonPressed {
    // 根据你的需求调整逻辑
    if (myWebView.canGoBack) {
        // WebView可以返回,就回到上一页
        [myWebView goBack];
    } else {
        // 没有上一页,就退出当前页面
        [self.navigationController popViewControllerAnimated:YES];
    }
}

额外补充(处理网页内的PDF链接)

如果你的WebView是先加载普通网页,然后用户点击网页里的PDF链接打开PDF,那上面的初始化判断就不够用了。这时候需要在webView:shouldStartLoadWithRequest:navigationType:代理方法中,每次请求新资源时都判断是否是PDF,更新isPdf的值:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *requestURL = request.URL;
    // 每次请求都判断是否为PDF
    _isPdf = [[requestURL.pathExtension isEqualToString:@"pdf"]];
    return YES;
}

注意事项

  • 确保你的控制器是嵌入在UINavigationController中的,否则navigationItem不会生效,按钮无法显示出来。
  • 如果你用的是较新版本的iOS,建议考虑使用WKWebView替代UIWebView(UIWebView已经被废弃),逻辑上是类似的,只是代理方法略有不同。

内容的提问来源于stack exchange,提问作者Zilant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:59:40