【问题标题】:Using UIRefreshControl使用 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'

我很困惑:(

【问题讨论】:

    标签: iphone ios objective-c nstimer uirefreshcontrol


    【解决方案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];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多