添加依赖于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的子视图的正确位置是啥?的主要内容,如果未能解决你的问题,请参考以下文章

可以将行号添加到不依赖于顺序的 SELECT 子句

Rff:如何在 ffdf 对象中添加一个依赖于同一行中其他元素的新列?

iOS:在自定义视图中添加新约束依赖于视图的框架

如何读取 CSV、再添加两列并插入依赖于当前列的数据?

Android studio怎么为应用程序添加模块依赖

单击保存按钮后如何在用户窗体中添加依赖于另一个组合框的excel vba组合框而不影响清除数据功能