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

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

时间: 2024-10-07 07:02:48

使用MJRefresh返回上一个界面蹦掉的情况的相关文章

Android - 返回上一个界面finish()方法

返回上一个界面finish()方法 本文地址: http://blog.csdn.net/caroline_wendy Android可以使用finish()方法,实现函数返回的功能,当不是Activity内部调用时,需要使用getActivity()方法的返回值Activity调用. 如实现了一个提示框(AlertDialog),包含两个按钮,返回和设置: 一个是跳转定位服务设置界面,一个是返回上一级界面. DialogFragment mLocationDialog = new AlertD

js控制5秒返回指定界面,或上一个界面

js控制5秒返回指定界面,代码如下 <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>无标题文档</title> <script type="text/javascript"> function countDown(secs,surl){ //alert(surl);

Android右滑返回上一界面

今天突然心血来潮,想在自己的项目里面加一个右滑finish界面的功能.思路很简单就是拦截屏幕滑动事件,然后finish当前页面,不多说了,上代码吧. 第一步:利用VelocityTracker计算滑动速度,及一些附带的代码. private VelocityTracker mVelocityTracker = null;//速度记录器 private int getScrollVelocity() { mVelocityTracker.computeCurrentVelocity(1000);

h5 网络断网时,返回上一个页面 demo (与检测网络代码相结合,更直观看到结果)

页面一: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>网络在线与离线</title> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maxi

android中按back键返回上一个activity,如何重新调用上一个activity的oncreate方法?

默认情况下是不会调用的. @Override public void onBackPressed() { String titleStr = edittitle.getText().toString(); String contentStr = editcontent.getText().toString(); if (title.equals(titleStr) && content.equals(contentStr)) { super.onBackPressed(); } else

在Chrome中设置返回上一个tab的快捷键

在mac上使用Chrome, control+tab是切换到下一个tab, control+shift+tab是切换到上一个tab, 感觉这个键位不是特别好按,想设置成control+1 进入mac的 系统设置 -> 键盘 -> 快捷键 Mac System Preferences→Keyboard→Shortcuts. https://apple.stackexchange.com/a/174979/1443 在这里就可以添加快捷键设置了 比如将Select Previous Tab设置成c

ASP.Net 返回上一个页面(Request.UrlReferrer)

Request.UrlReferrer可以获取客户端上次请求的url的有关信息.  这样我们就可以通过这个属性返回到“上一页”,示例如下 1.      首先在Page_load中获得并储存该信息 Page_load(object obj,EventArgs e)             {                     if(!IsPostBack)                    {                         if(Request.UrlReferrer

iOS 中导航控制器全屏向右滑动返回上一界面

在iOS中,导航控制器默认就自带了侧滑功能,当用户在界面的左边(左边边缘)滑动的时候,才会有侧滑功能.但是我们往往在开发的过程中需要在屏幕的任意位置滑动,都需要返回到上一个界面. 多说无意,直接看代码: 效果图部分: 代码部分(第二个界面): #import "CJSecondViewController.h" @interface CJSecondViewController ()<UIGestureRecognizerDelegate> @end @implementa

android 中FragmentActivity中模拟返回键返回上一个Activity效果

FragmentTransaction中先加入一个Fragment,这个Fragment就是当前要显示的Fragment, 当通过事件触发显示第二个Fragment时,在加入第二个Fragment并调用fragmentTransaction.addToBackStack(null); 在onBackPressed方法中调用mFragmentManager.popBackStack();回到第一个Fragment package com.example.fragmentdemo; import a