使用 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有三种方式(不使用,动态使用,静态使用,默认是动态使用)