• 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老师的框架了

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

    将来的你会感谢今天如此努力的你! 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    编译Excel遇到的DialogBoxW宏的实参不足问题
    C# 简单连接数据库并执行SQL查询语句
    AutoCAD VBA 遍历所有对象
    VBA: 错误消息:"类未注册"插入用户窗体
    解决Qt程序发布时中文乱码问题
    Qt操作excel
    HWND_BROADCAST的一个用法——修改环境变量,立即通知系统
    VC环境使用XML解析器(TinyXML)编程
    C++ XML解析之TinyXML篇(转载)
    C/C++枚举目录中的文件或文件夹
  • 原文地址:https://www.cnblogs.com/chglog/p/4770715.html
Copyright © 2020-2023  润新知