You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何滚动TableView时显示的Cell数量多于numberOfRowInSection返回的3行?

为什么TableView显示的Cell数量超过numberOfRowsInSection返回的3个?

我来帮你排查几个最常见的原因:

  • 先检查numberOfSections的返回值:如果你的TableView是分组样式,或者你自定义实现了numberOfSections方法,要是这个方法返回了大于1的数值(比如2),那总Cell数就是3×section数,自然会出现更多Cell。很多时候开发者会不小心写错这个方法的返回值,或者忽略了它的存在——如果没实现这个方法,默认返回1,但要是有自定义逻辑出错就会踩坑。

  • 确认numberOfRowsInSection的实际返回值:别光看你写的return 3,实际运行时这个方法可能因为条件判断返回了其他数值?比如你是不是写了类似if (isLoaded) return 3; else return 10;的逻辑,而isLoaded在滚动时还没生效?建议在这个方法里加个断点或者打印日志,看看实际返回的到底是不是3。

  • 检查数据源方法的签名是否正确:不管是Swift还是Objective-C,要是numberOfRowsInSection的方法签名写错了,TableView会直接忽略你的自定义实现,用默认逻辑(比如可能显示数据源数组的全部元素?)。比如Swift里要确保方法是:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3
    }
    

    Objective-C里要确保是:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 3;
    }
    

    签名不对的话,这个方法根本不会被调用。

  • 有没有忘记调用reloadData()? 如果之前你的数据源或者numberOfRowsInSection返回值是更大的数,后来改成了3,但没调用tableView.reloadData(),TableView可能还保留着之前的Cell缓存,滚动时会复用这些旧Cell,看起来就像显示了更多。这种情况只要调用reloadData()刷新一下就好了。

  • 会不会把分隔线/额外视图当成了Cell? 你提到Cell带有分隔线,会不会是TableView的默认分隔线,或者你添加了section header/footer,这些视图看起来像是额外的Cell?不过你说向下滚动能看到更多Cell,这种可能性相对小,但也可以检查一下有没有多余的header/footer设置。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:01:10