UITableView 和 UIRefreshControl

UITableView and UIRefreshControl

提问人:gabac 提问时间:10/1/2012 更新时间:3/4/2015 访问量:20187

问:

我正在尝试将 UIRefreshControl 移动到我的 headerView 顶部,或者至少让它与 contentInset 一起使用。有人知道如何使用它吗?

我使用 headerView 在 TableView 中滚动时有一个漂亮的背景。我想要一个可滚动的背景。

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Set up the edit and add buttons.

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.backgroundColor = [UIColor clearColor];

[self setWantsFullScreenLayout:YES];

self.tableView.contentInset = UIEdgeInsetsMake(-420, 0, -420, 0);

UIImageView *top = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"top.jpg"]];
self.tableView.tableHeaderView = top;

UIImageView *bottom = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bottom.jpg"]];
self.tableView.tableFooterView = bottom;

UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"settingsIcon"] style:UIBarButtonItemStylePlain target:self action:@selector(showSettings)];
self.navigationItem.leftBarButtonItem = leftButton;

UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addList)];
self.navigationItem.rightBarButtonItem = addButton;

//Refresh Controls
self.refreshControl = [[UIRefreshControl alloc] init];

[self.refreshControl addTarget:self action:@selector(refreshInvoked:forState:) forControlEvents:UIControlEventValueChanged];
}
UITableView UI刷新控制

评论


答:

32赞 Echelon 10/16/2012 #1

我不太确定你对 contentInset 的东西有什么意图,但就将 UIRefreshControl 添加到 UITableView 而言,这是可以做到的。UIRefreshControl 实际上旨在与 UITableViewController 一起使用,但如果只是将其作为子视图添加到 UITableView,它就会神奇地工作。请注意,这是未记录的行为,在其他 iOS 版本中可能不受支持,但它是合法的,因为它不使用私有 API。

- (void)viewDidLoad
{
    ...
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [self.myTableView addSubview:refreshControl];
}

- (void)handleRefresh:(id)sender
{
    // do your refresh here...
}

感谢@Keller注意到了这一点

评论

3赞 Godfather 4/4/2013
在普通的 UIViewController 中,您没有 self.refreshControl,因此您完全错了 lensovet
1赞 AlBeebe 4/15/2014
如果您的 tableview 具有标题视图(至少在 iOS7 上),则此方法存在一些问题。当您在刷新时向下滚动时,表格部分会全部错位,并因标题视图的高度而偏移。
10赞 self.name 1/30/2014 #2

@Echelon的回答是正确的,但我有一个小建议。将刷新控件添加为@property,以便以后可以访问它。

在 YourViewController.h 中

@property (nonatomic, strong) UIRefreshControl *refreshControl;

在 YourViewController.m 中

-(void) viewDidLoad {
    self.refreshControl = [[UIRefreshControl alloc] init];
    [self.refreshControl addTarget:self action:@selector(refresh) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:self.refreshControl]; //assumes tableView is @property
}

而这样做的重要原因......

-(void)refresh {
    [self doSomeTask]; //calls [taskDone] when finished
}

-(void)taskDone {
    [self.refreshControl endRefreshing];
}

只是提供对 UIRefreshControl 的类范围访问权限,以便你可以 endRefreshing 或检查 UIRefreshControl 的 isRefreshing 属性。

评论

1赞 Emil Ahlbäck 1/30/2015
@property (nonatomic,strong) UIRefreshView *refreshControl;你可能是说这里。右?UIRefreshControl
0赞 Ron 11/3/2016
@self.name 为什么完成后会打电话?这让我很惊讶。事实上,它应该执行并再次返回刷新,对吗?+1 表示您的答案。taskDonetaskDone