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
相关产品推荐
相关产品推荐

