iOS开发——常见错误——使用MJRefresh返回上一个界面蹦掉的情况

最近在使用MJRefresh框架时发现了一个bug

下面是我的源代码

前一个界面

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    // 显示网页
    CHGWebViewController *webVc = [[CHGWebViewController alloc] init];
    
    // 设置数据
    webVc.data = self.data[indexPath.row];
    
    [self.navigationController pushViewController:webVc animated:YES];
}

后一个界面

#import "CHGWebViewController.h"
#import "CHGData.h"
#import "MJChiBaoZiHeader.h"

@interface CHGWebViewController ()<UIWebViewDelegate>

@property (nonatomic, weak) UIWebView *webView;

@end

@implementation CHGWebViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 添加背景
    self.view.backgroundColor = [UIColor whiteColor];
    
    // 显示标题
    self.title = self.data.username;
    
    // 1.网页控件
    UIWebView *webView = [[UIWebView alloc] init];
    
    // 2.设置frm
    webView.frame = self.view.bounds;
    self.webView = webView;
    
    // 3.添加webview
    [self.view addSubview:webView];

    // 4.显示网页
    NSURL *url  = [NSURL URLWithString:self.data.url];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 用于调整界面 (适配手机版网页)
    webView.scalesPageToFit = YES;
    // 加载网页
    [webView loadRequest:request];
    [webView reload];
    
    // 5. 设置代理 添加下拉刷新
    webView.delegate = self;
    
    __weak UIScrollView *scrollView = webView.scrollView;
    
//    // 添加下拉刷新控件
//    scrollView.header = [MJChiBaoZiHeader headerWithRefreshingBlock:^{
//        [webView reload];
//    }];
    scrollView.header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(reload)];
    
    [webView.scrollView.header beginRefreshing];
    
}

- (void)reload{

    [self.webView reload];
}

#pragma mark - webViewDelegate
- (void)webViewDidFinishLoad:(nonnull UIWebView *)webView
{
    [self.webView.scrollView.header endRefreshing];
}

- (void)dealloc
{
    NSLog(@"%s",__func__);
}
@end

注意:

当你使用Block这个方法来添加下拉刷新时,如果数据没有加载完毕,然后返回到上一个界面,程序就蹦了

    scrollView.header = [MJChiBaoZiHeader headerWithRefreshingBlock:^{

        [webView reload];

    }];

个人的理解:

当你返回上一个界面时,CHGWebViewController这个控制器已经被销毁了,而数据仍然在加载中,当数据加载完毕时,

webView已经被销毁,无法接收数据,这时就会报一个野指针错误

解决方案:

解决的办法已经在代码中

    scrollView.header = [MJChiBaoZiHeader headerWithRefreshingTarget:self refreshingAction:@selector(reload)];

也就是使用这个调用函数的方法添加下拉刷新

至于为什么,那就要去研究下MJ老师的框架了

先这样吧,以后找到具体原因再回来更新博客

将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/chglog/p/4770715.html