添加依赖于scrollView.contentSize的子视图的正确位置是啥?
Posted
技术标签:
【中文标题】添加依赖于scrollView.contentSize的子视图的正确位置是啥?【英文标题】:What is the right place to add a subview dependent on scrollView.contentSize?添加依赖于scrollView.contentSize的子视图的正确位置是什么? 【发布时间】:2011-05-10 10:25:33 【问题描述】:我正在使用Cocoanetic's pull-to-reload,但有一点不同:我希望 UITableView 能够拉起,可以加载更多数据。
我自定义了这些类,并设法调整了所有功能以支持这一点。基本上,让我难过的是在我的代码中创建和添加额外视图的位置。
我首先尝试将其添加到 Cocoanetic 类的 viewDidLoad 中(UITableViewController
):
- (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™ 相去甚远
那么,在这种情况下,The Right Way™ 会是什么?
【问题讨论】:
【参考方案1】:解决方案比我想象的要容易,而且 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];
【讨论】:
【参考方案2】:从上一个 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 前后向委托发送方法。它就像一个魅力。
【讨论】:
那么我将如何去做,记住我使用的是 UITableViewController?我从笔尖加载 UITableView,因此我的额外问题 :)以上是关于添加依赖于scrollView.contentSize的子视图的正确位置是啥?的主要内容,如果未能解决你的问题,请参考以下文章