UITableView:显示tableFooterView时运行代码?

时间:2012-02-01 11:27:50

标签: objective-c ios cocoa-touch uitableview

我正在使用UITableView中的UIView tableFooterView 在我的表格底部显示“正在加载更多”标签。当显示 tableFooterView 中的UIView时,我需要开始一些懒惰的内容下载。我如何知道何时显示tableFooterView?

5 个答案:

答案 0 :(得分:12)

而不是确定页脚视图何时显示可以检查何时正在请求表的最后一行然后加载数据。用户滚动到最后一行而不向下滚动以查看页脚的次数可能很少。效果将是相同的,即您知道用户何时滚动到底部并且您应该加载更多数据。

这可以很容易地在tableView:cellForRowAtIndexPath:中实现。通过跟踪IndexPath是最后一个,并在每次添加或删除新行时更新它,您只需检查所请求单元格的IndexPath是否与最后一行的IndexPath相同,并触发延迟加载来自那里的更多数据,与您目前正在进行的方式相同。

答案 1 :(得分:1)

您可以将页脚的框架转换为窗口坐标并进行比较。当页脚被隐藏时,它假设它具有Y原点坐标> 480(对于肖像模式),当出现页脚时,则Y原点坐标<你可以在didScroll方法中进行比较。

谢谢,希望这对你有帮助。

见方法 convertRect:toView:

答案 2 :(得分:0)

因为正如你所说,tableFooter是一个UIView,它处理drawRect中的绘图:。如果你覆盖,你可能会收到通知。

编辑:旧答案错了。

答案 3 :(得分:0)

如果您的tableFooterView正在观察对表的contentOffset属性的更改(也可能是表的contentSize属性中的更改),则可以准确计算它何时滚动到视图中以下变量:

  • tableView.contentOffset.y - 内容视图的原点偏离滚动视图原点的垂直量
  • tableView.contentSize.height - 内容视图的高度
  • tableView.bounds.size.height - 表格的高度

如果垂直内容偏移+表格边界高度超过表格内容大小高度,我们可以假设页脚现在在视图中。

您可以将其包装在if语句中并使用它来发送通知。然后,您可以进行进一步测试,以使页脚动态拉伸或其他预期效果:

if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){
    //send notification, dynamic resizing, etc...` 
}

这里有一段代码片段:

// Set up an observer for changes in the table's contentOffset or contentSize.
// This can be done during initialisation of the tableFooterView
[tableView addObserver:self 
            forKeyPath:@"contentOffset" 
               options:NSKeyValueObservingOptionNew
               context:NULL];
[tableView addObserver:self 
            forKeyPath:@"contentSize"
               options:NSKeyValueObservingOptionNew
               context:NULL];

// Further down in code, listen for the changes:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
  change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentOffset"] || 
        [keyPath isEqualToString:@"contentSize"]) {

        if((tableView.contentOffset.y + tableView.bounds.size.height) > tableView.contentSize.height){
            // the tableFooterView should now be in view
            [[NSNotificationCenter defaultCenter] 
                postNotificationName:@"scrollToLoadNeedsLoad"
                              object:self];
            // dynamically change the footer here (ideal for making it stretch with the table)
        }

    }
}

您可以在保存对表的引用的视图控制器中实现此功能,也可以将其封装在您自己的自定义ScrollToLoadView中。

答案 4 :(得分:-1)

简单回答:

  func tableView(_ tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {}