首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIRefreshControl on viewDidLoad

UIRefreshControl on viewDidLoad
EN

Stack Overflow用户
提问于 2013-07-29 17:46:35
回答 4查看 18.8K关注 0票数 26

我使用以下代码创建一个UIRefreshControl:

代码语言:javascript
复制
- (void) viewDidLoad
{
    [super viewDidLoad];

    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(doLoad) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

- (void) doLoad
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
            // Instead of sleeping, I do a webrequest here.
            [NSThread sleepForTimeInterval: 5];

            dispatch_async(dispatch_get_main_queue(), ^{
                [tableView reloadData];
                [self.refreshControl endRefreshing];
            });
    });
}

效果很好。如果我导航到我的视图,拖动表,代码运行和数据显示。

但是,我想要做的是在“加载”状态出现时立即拥有视图(这样用户就知道正在发生什么事情)。我试着添加以下内容:

代码语言:javascript
复制
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.refreshControl beginRefreshing];
}

但这似乎行不通。当我导航到视图时,它看起来像是一个常规视图(刷新控件不可见),而且当我试图提取刷新控件时,它从未完成加载。

显然我走错路了。对我该如何处理这件事有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-01 17:26:15

试试这个:

代码语言:javascript
复制
- (void) viewWillAppear: (BOOL) animated
{
    [super viewWillAppear: animated];

    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
    [self.refreshControl beginRefreshing];    

    // kick off your async refresh!
    [self doLoad];
}

记得在某个时候打电话给endRefreshing!

编辑以添加完整的工作示例:

这个示例视图控制器是在iOS6.1中构建和运行的,因为根视图控制器从UIRefreshControl开始,当应用程序启动时,它已经可见并具有动画效果。

TSTableViewController.h

代码语言:javascript
复制
@interface TSTableViewController : UITableViewController
@end

TSTableViewController.m

代码语言:javascript
复制
#import "TSTableViewController.h"

@implementation TSTableViewController
{
    NSMutableArray*    _dataItems;
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.refreshControl = [UIRefreshControl new];

    [self.refreshControl addTarget: self
                            action: @selector( onRefresh: )
                  forControlEvents: UIControlEventValueChanged];
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear: animated];

    self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);

    [self.refreshControl beginRefreshing];
    [self onRefresh: nil];
}

- (void) onRefresh: (id) sender
{
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

        _dataItems = [NSMutableArray new];

        for ( int i = 0 ; i < arc4random() % 100 ; i++ )
        {
            CFUUIDRef uuid = CFUUIDCreate( NULL );

            [_dataItems addObject: CFBridgingRelease(CFUUIDCreateString( NULL, uuid)) ];

            CFRelease( uuid );
        }

        [self.refreshControl endRefreshing];

        [self.tableView reloadData];
    });
}

#pragma mark - Table view data source

- (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
{
    return 1;
}

- (NSInteger) tableView:(UITableView *) tableView numberOfRowsInSection: (NSInteger) section
{
    return _dataItems.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
                                                   reuseIdentifier: nil];

    cell.textLabel.text = [_dataItems objectAtIndex: indexPath.row];

    return cell;
}

@end
票数 68
EN

Stack Overflow用户

发布于 2014-12-15 11:59:12

手动修改contentOffset不安全和错误的,在某些情况下可能导致意外行为。此解决方案的工作原理完全不涉及contentOffset

代码语言:javascript
复制
func showRefreshControl(show: Bool) {
    if show {
        refreshControl?.beginRefreshing()
        tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: true)
    } else {
        refreshControl?.endRefreshing()
    }
}
票数 15
EN

Stack Overflow用户

发布于 2013-08-07 03:52:50

另一个选项是在您的UIControlEventValueChanged中触发一个viewDidAppear:触发初始刷新。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17930730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档