首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

滚动后UITableViewCell内容消失

基础概念

UITableViewCell 是 iOS 开发中用于显示列表项的视图组件。当用户滚动 UITableView 时,系统会根据需要重用 UITableViewCell 实例以提高性能。

相关优势

  1. 性能优化:通过重用单元格,减少内存占用和创建新视图的开销。
  2. 流畅的用户体验:快速响应用户的滚动操作。

类型

  • 基本单元格:简单的文本标签。
  • 自定义单元格:包含图像、按钮等复杂视图。

应用场景

  • 新闻列表:显示新闻标题和摘要。
  • 联系人列表:显示姓名、头像和电话号码。
  • 购物车:显示商品名称、价格和数量。

问题原因

UITableViewCell 内容在滚动后消失,通常是由于以下原因:

  1. 重用机制问题:单元格被重用时,之前的数据没有被正确清除或更新。
  2. 数据绑定错误:数据模型与单元格视图之间的绑定不正确。

解决方法

以下是一个示例代码,展示如何正确处理 UITableViewCell 的重用和数据绑定:

代码语言:txt
复制
import UIKit

class MyTableViewCell: UITableViewCell {
    let titleLabel = UILabel()
    let subtitleLabel = UILabel()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        setupViews()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupViews() {
        contentView.addSubview(titleLabel)
        contentView.addSubview(subtitleLabel)

        // 设置布局约束
        titleLabel.translatesAutoresizingMaskIntoConstraints = false
        subtitleLabel.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 8),
            titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),

            subtitleLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 4),
            subtitleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 16),
            subtitleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -16),
            subtitleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -8)
        ])
    }

    func configure(with title: String, subtitle: String) {
        titleLabel.text = title
        subtitleLabel.text = subtitle
    }
}

class MyViewController: UIViewController, UITableViewDataSource {
    let tableView = UITableView()
    var data = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        view.addSubview(tableView)

        // 设置布局约束
        tableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyTableViewCell
        let item = data[indexPath.row]
        cell.configure(with: item, subtitle: "Subtitle for \(item)")
        return cell
    }
}

关键点解释

  1. 自定义单元格类MyTableViewCell 包含了标签视图,并在 setupViews 方法中设置了布局约束。
  2. 数据绑定方法configure(with:) 方法用于更新单元格的内容。
  3. 表格视图数据源:在 cellForRowAt 方法中,通过 dequeueReusableCell(withIdentifier:) 获取重用的单元格实例,并调用 configure(with:) 方法更新其内容。

通过这种方式,可以确保每次单元格被重用时,其内容都能正确更新,避免内容消失的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

UITableViewCell系列之(二)视觉差滚动效果前言

前言 之前在UITableViewCell系列之(一)让你的cell支持二次编辑中说过,很早就想系统的写一篇关于UITableViewCell的文章,目的是总结一下自己在项目开发中用过的一些关于UITableViewCell...如下是我所要说的视觉差滚动效果(即:滚动tableView时候,每一行的图片都会根据滚动方向和滚动距离的不同进行移动,给人一种图片在移动的视觉体验),由于下面gif图失真卡顿严重,真实效果大家可以参考demo...用于tableView滚动时,更新imageView的Y坐标值 在UIScrollViewDelegate的scrollViewDidScroll:方法里调用cell的对象方法,更新imageView的...Y坐标值 注意事项: 1. cell的imageView的上、下边距要超出cell,不然tableView滚动的时候没有多余的部分显示。

6.1K30
  • rAF实现表格内容自动滚动

    rAF实现表格内容自动滚动 前言 实习导师让我实现表格内容自动滚动,实际就是大屏项目可能会用上的。正好之前看到rAF的介绍,实际上也没用过,所以就用rAF来玩一波。...目标: 让表格的内容会自动滚动 鼠标悬浮,动画停止 到底后会自动回到顶部,继续滚动 element表格自带滚动 首先呢,element的表格是自带了滚动效果的,但是需要小小的设置一下。...这个时候可能会想:直接使用overflow: auto;不就能实现表格滚动了吗?但是,这个表格滚动效果并不是想要的表格内容滚动。表头也会滚不见。...这时候我们仔细想一下就会发现,上面的滚动的只是表格内容,但是实际上我们把高度慢慢地传下来了,所以这个时候的滚动盒子 el-scrollbar的高度也是整个表格的高度。...动画停了,所以我们还得添加一个定时器,回滚后停一会,再重新开始动画。

    2.1K20

    手机将在5年后消失?

    如果有人跟你说,手机5年后就消失了,你信不信? 5-10年内,进入“智能一切”新时代?...如果这五点都能实现,那么30年后的道路将不会再现拥堵不堪的场面了。 四、无须驾照也能开车 30年后,你或会发现路上跑的汽车里,驾驶员并没有在操控汽车,而是悠闲地聊天或玩手机、电脑。...驾驶这样的汽车,无须担心自己的驾驶技术或有无驾照问题,走近车身自动开启车门,上车后只需说出目的地,无须驾驶,超智能机器人汽车就会带你去任何地方。...五、办事无须出门,动动手指就搞定 来个穿越,来到了30年后的世界。你会发现生活在30年后的人们只干三件事:工作、休闲娱乐、谈情说爱。...六、空气环境变好了,雾霾不见了 30年后的世界,空气质量将会变得很好,雾霾天气将再也不会出现。

    81460

    纯css实现纵向滚动固定表头与横向内容滚动

    这次要实现的目标是类似这种,纵向滚动时表头固定,横向滚动时,表头跟着滚动 ?...image.png 最基础的思路就是表头和内容是用两个表格来显示(图来自https://zhuanlan.zhihu.com/p/33280304),关于怎么保存表头和内容列宽一致链接里这个文章里也有写就不另外说了...image.png 纵向滚动是挺好实现的,我开始是在内容的表格外面套了一个div,之后设置overflow-y:auto就实现纵向滚动了。 但横向滚动呢?...,但是横向滚动的时候纵向滚动条也被滚走了。...滚动条被滚走了 然后想到了是用js来同步,可以是可以的,但是还是想挣扎一下。 之后想到了fixed,发现如果表头设置为fixed无论横向滚动还是都会被固定在原地。

    5.5K00

    弹窗查看内容时 内容滚动区域设置为body区

    看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动 什么意思呢?...看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动 点我预览 ?...将滚动位置放到整个body中,让弹窗中内容自适应高度 这么做的好处自然很明显,body区域有更大的可视区域,来看看最后的效果 点我预览 ?...layerShade.removeClass('visible'); $layerWrap.removeClass('visible'); }); } // 显示弹窗,并设置弹窗内容滚动区为...fixed之后,弹窗的最大高度为视窗高度,若要使得弹窗的内容区直接显示出来,就必须设置为非fixed值,而弹窗不能少了定位,那就只能使用 absolute值了 但设置了absolute就无法计算页面有滚动条的时候的位置

    1.3K20

    浏览器关闭后Session真的消失了吗?

    下面就具体的去解释: 当用户第一次访问服务器web应用程序中支持session的某个程序的时候,客户端(浏览器)的请求头cookie属性中没有JSESSIONID信息,那么服务器接收到请求后执行了...结束生命周期,有以下两种办法: 一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用; 一个是当前用户和服务器的交互时间超过默认时间后Session...JavaScript中的window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法就是不去管它,让它等到默认的时间后,...自动销毁 那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?

    2.7K30

    3种方法实现CSS隐藏滚动条并可以滚动内容

    隐藏滚动条的同时还需要支持滚动,我们经常在前端开发中遇到这种情况,最容易想到的是加一个iscroll插件,但其实现在CSS也可以实现这个功能,我已经在很多地方使用了,下面一起看看这三种方法。...方法1:计算滚动条宽度并隐藏起来 在本站的侧栏,你可以看到前端日报的那块内容并没有滚动条,但鼠标移上去却可以滚动内容。这是什么技术呢? 其实我只是把滚动条通过定位把它隐藏了起来。...方法2:使用三个容器包围起来,不需要计算滚动条的宽度 该代码最早是在Microsoft博客上看到的,跟我上面的思路差不多,只不过人家里面又加多了一个盒子,将内容限制在盒子里面了。...这样子就看不到滚动条同时也可以滚动。...那就是自定义滚动条的伪对象选择器::-webkit-scrollbar,详情请看之前的文章:CSS3自定义webkit滚动条样式 chrome 和Safari .element::-webkit-scrollbar

    22.3K52

    UITableView性能优化-中级篇

    进阶篇 最近遇到一个需求,对tableView有中级优化需求 要求 tableView 滚动的时候,滚动到哪行,哪行的图片才加载并显示,滚动过程中图片不加载显示; 页面跳转的时候,取消当前页面的图片加载请求...,是的话,不加载图片; cell 滚动结束的时候,获取当前界面内可见的所有cell 在2的基础之上,让所有的cell请求图片数据,并显示出来 步骤1: - (UITableViewCell *)tableView...- trackingMode 滚动的时候,进入trackingMode,导致defaultMode下的任务会被暂停,停止滚动的时候 ==> 进入defaultMode - 继续执行defaultMode...runloopDemo.gif 效果如上 滚动的时候不加载图片,滚动结束加载图片-满足 滚动结束,之前滚动过程中的cell会加载图片 => 不满足需求 版本回滚到Runloop之前 - git reset...cancelLoadImage{ [_task cancel]; } @end 思路: 创建一个可变字典,以indexPath:manager的格式,将当前的图片下载操作存起来 每次下载之前,将当前下载线程存入,下载成功后,

    1.6K20

    MyLayout&TangramKit 的重大升级!

    也就是说这类视图有自己的固有内容尺寸(intrinsicContentSize)。...这个方法返回根据自身内容而计算出来的固有内容尺寸的size,如果没有固有内容尺寸则方法返回一个特殊的默认值UIViewNoIntrinsicMetric(-1)。...比如一些界面中有父视图的尺寸由子视图的尺寸来确定的;还比如UIScrollView中为了能实现滚动需要根据添加到里面的子视图来调整contentSize的尺寸;又比如某些UITableViewCell中的高度是动态的...如果不需要水平滚动则改为将容器视图的宽度等于UIScrollView视图的宽度。通过这样的设置后UIScrollView视图的contentSize将得到自动的计算。...因此如果想使用布局视图的尺寸自适应功能,那么在将布局视图的尺寸设置为wrap后,就可以像使用UILabel那样不用去设置布局视图的宽度约束和高度约束了。比如有两个兄弟视图A,B。

    2.1K20

    LabVIEW显示控件中内容过长设置自动滚动条

    本篇博文分享程序设计时一个细节小技巧,在LabVIEW显示控件中内容过长设置自动滚动条。...LabVIEW显示控制设置滚动条是非常简单的,选中组件,鼠标右键选择:属性→外观→使能显示垂直滚动条,如下图所示: 这样可见显示控件右侧有了垂直滚动条,如下所示: 但是在使用时,当显示控件中数据显示填充满后...,滚动条并不会自动下移,此时为了方便查看数据可以设置滚动条自动调整至末尾。...需要在程序面板中选中显示控件,鼠标点击右键,选择:创建→属性节点→文本→滚动条位置,如下图所示: 滚动条位置属性可以设置滚动框在滚动条中的位置,具体说明如下所示: 引用了滚动条位置属性,在程序中将最大行数赋予该属性...,则表示将自动滚动到文本最后一行,实现程序如下所示:

    2.6K30
    领券