gpt4 book ai didi

ios - viewDidLoad 上的 UIRefreshControl

转载 作者:IT王子 更新时间:2023-10-29 07:54:58 25 4
gpt4 key购买 nike

我正在使用以下代码创建 UIRefreshControl:

- (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];
});
});
}

效果很好。如果我导航到我的 View ,拖动表格,代码运行并显示数据。

但是,我想做的是让 View 一出现就处于“正在加载”状态(这样用户就知道发生了什么事)。我尝试添加以下内容:

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.refreshControl beginRefreshing];
}

但是好像不行。当我导航到该 View 时,它看起来像一个常规 View (刷新控件不可见),而且当我尝试拉动刷新控件时,它从未完成加载。

显然我的做法是错误的。关于我应该如何处理这个问题有什么建议吗?

最佳答案

试试这个:

- (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!

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

这个示例 View Controller 在 iOS6.1 中作为 Root View Controller 构建和运行,启动时 UIRefreshControl 已经可见并且在应用程序启动时具有动画效果。

TSTableViewController.h

@interface TSTableViewController : UITableViewController
@end

TSTableViewController.m

#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

关于ios - viewDidLoad 上的 UIRefreshControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com