使用 UIRefreshControl

Posted

技术标签:

【中文标题】使用 UIRefreshControl【英文标题】:Using UIRefreshControl 【发布时间】:2013-07-30 04:17:42 【问题描述】:

目前,我有一个使用 UIRefreshControl 的应用程序。

我遇到了一些问题......

这是我的代码:

- (void)viewDidLoad

    [super viewDidLoad];
    self.searchDisplayController.delegate = self;
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
    [self.rearTableView addSubview:refreshControl];



- (void)refresh:(UIRefreshControl *)refreshControl 
    [refreshControl beginRefreshing];
    [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(endRefresh:) userInfo:nil repeats:NO];


- (void)endRefresh:(UIRefreshControl *)refresh

    [refresh endRefreshing];

拉动表格视图确实初始化了timer,但2 秒数已到...我的应用程序crashes 并发送此消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFTimer endRefreshing]: unrecognized selector sent to instance 0x9c093c0'

我很困惑:(

【问题讨论】:

【参考方案1】:

问题:

出现此问题的原因是:

[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(endRefresh:) userInfo:nil repeats:NO];

您已添加endRefresh: 作为计时器的选择器。所以endRefresh: 方法的参数将是NSTimer 而不是UIRefreshControl

实际的方法签名如下所示:

- (void)endRefresh:(NSTimer *)refresh

   //your code

您正在调用endRefreshing NSTimer 对象,这就是发生崩溃的原因。

声明如下:

- (void)endRefresh:(UIRefreshControl *)refresh

只需将 NSTimer 对象类型转换为 UIRefreshControl 即可。

相当于:

- (void)endRefresh:(NSTimer *)timer

   UIRefreshControl *refresh = (UIRefreshControl *)timer;
   [refresh endRefreshing];

解决方案一:

UIRefreshControl 声明为属性并使用它。

解决方案 2:

改变你的方法,比如:

- (void)refresh:(UIRefreshControl *)refreshControl

    [refreshControl beginRefreshing];
    [self performSelector:@selector(endRefresh:) withObject:refreshControl afterDelay:2.0f];


- (void)endRefresh:(UIRefreshControl *)refresh

    [refresh performSelectorOnMainThread:@selector(endRefreshing) withObject:nil waitUntilDone:NO];

【讨论】:

以上是关于使用 UIRefreshControl的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)