我正在使用Cocoanetic's pull-to-reload,但有一点麻烦:我希望UITableView能够提升,加载更多数据。
我自定义了这些类,并设法调整所有功能来支持它。基本上,让我难过的是我的代码中创建和添加额外视图的位置。
我首先尝试在Cocoanetic的类(UITableViewController
)的viewDidLoad中添加它:
- (void)viewDidLoad
{
[super viewDidLoad];
refreshHeaderView = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f - self.view.bounds.size.height, 320.0f, self.view.bounds.size.height)];
refreshFooterView = [[EGORefreshTableFooterView alloc] initWithFrame:CGRectMake(0.0f, 0.0f + self.tableView.contentSize.height, 320.0f, 20.0f)];
[self.tableView addSubview:refreshHeaderView];
[self.tableView addSubview:refreshFooterView];
self.tableView.showsVerticalScrollIndicator = YES;
}
这不起作用,因为此时self.tableView.contentSize.height
为零,因为该表尚未加载它的数据。
不用担心,我想,并试图将它添加到我制作的UITableViewController子类的viewDidLoad中:
- (void)viewDidLoad
{
[super viewDidLoad];
// stuff
self.model = [ListingModel listingModelWithURL:@"avalidurl" delegate:self];
refreshFooterView = [[EGORefreshTableFooterView alloc] initWithFrame:CGRectMake(0.0f, 0.0f + self.tableView.contentSize.height, 320.0f, 20.0f)];
[self.tableView addSubview:refreshFooterView];
}
注意我首先设置模型,但由于同样的原因,这也不起作用。我认为桌子还没有铺好。我沮丧地给了我的班级BOOL
属性和addFooter
方法(BOOL
,以确保它只被调用一次)从tableView:cellForRowAtIndexPath:
调用,这显然与正确的方式™
那么,鉴于这种情况,什么会成为The Right Way™?
答案 0 :(得分:2)
解决方案比我想象的容易,7KV7实际上给了我所需的提示。
- (void)viewDidLoad
{
[super viewDidLoad];
// stuff
self.model = [ListingModel listingModelWithURL:@"avalidurl" delegate:self];
/*
We're forcing a reload of the table here, that way the table has a
contentSize, so adding the footerView now works correctly.
*/
[self.tableView reloadData];
[self addRefreshFooter];
}
答案 1 :(得分:1)
从之前的SO问题Get notified when UITableView has finished asking for data?继承UITableView的reloadData是最好的方法:
- (void)reloadData {
NSLog(@"BEGIN reloadData");
[super reloadData];
NSLog(@"END reloadData");
}
reloadData在表完成重新加载其数据之前不会结束。因此,当第二个NSLog被触发时,表视图实际上已经完成了对数据的询问。
如果您已经将UITableView子类化,则在reloadData之前和之后将方法发送给委托。它就像一个魅力。