添加依赖于scrollView.contentSize的子视图的正确位置是什么?

时间:2011-05-10 10:25:33

标签: iphone objective-c ios4

我正在使用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™?

2 个答案:

答案 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之前和之后将方法发送给委托。它就像一个魅力。