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

选定单元格时,Swift tableView单元格子视图闪烁(消失后重现)

选定单元格时,Swift tableView单元格子视图闪烁(消失后重现)是由于tableView的重用机制导致的。当tableView滚动时,为了提高性能,系统会重用已经滚出屏幕的单元格来显示新的内容。这就意味着,当一个单元格滚出屏幕时,它的子视图会被移除,并且可以被用于显示新的内容。

当你选定一个单元格时,tableView会调用tableView(_:didSelectRowAt:)方法来响应选定事件。在这个方法中,你可以对选定的单元格进行一些操作,比如改变子视图的状态或者执行其他逻辑。

然而,由于tableView的重用机制,当你选定一个单元格后,如果该单元格滚出屏幕并被重用,它的子视图会被移除。当该单元格再次滚回屏幕时,系统会重新创建子视图并添加到单元格上,这就导致了子视图的闪烁现象。

为了解决这个问题,你可以在tableView(_:didSelectRowAt:)方法中记录选定的单元格的状态,并在tableView(_:cellForRowAt:)方法中根据记录的状态来设置子视图的显示。具体的做法如下:

  1. 在数据模型中为每个单元格添加一个状态属性,用于记录是否被选定。
  2. tableView(_:didSelectRowAt:)方法中更新选定单元格的状态,并调用tableView.reloadRows(at:with:)方法来刷新该单元格。
  3. tableView(_:cellForRowAt:)方法中根据单元格的状态来设置子视图的显示。

以下是一个示例代码:

代码语言:swift
复制
// 数据模型
struct Item {
    var name: String
    var isSelected: Bool
}

// ViewController中的相关代码
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var items: [Item] = [
        Item(name: "Item 1", isSelected: false),
        Item(name: "Item 2", isSelected: false),
        Item(name: "Item 3", isSelected: false)
    ]
    
    // UITableViewDataSource方法
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let item = items[indexPath.row]
        
        cell.textLabel?.text = item.name
        cell.accessoryType = item.isSelected ? .checkmark : .none
        
        return cell
    }
    
    // UITableViewDelegate方法
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let item = items[indexPath.row]
        item.isSelected = !item.isSelected
        
        tableView.reloadRows(at: [indexPath], with: .none)
    }
}

在上述示例代码中,每个单元格的选定状态通过isSelected属性来记录。在tableView(_:cellForRowAt:)方法中,根据该属性来设置单元格的显示,如果被选定,则显示一个勾选标记。

这样,当你选定一个单元格时,它的子视图不会闪烁,而是根据选定状态来正确显示。

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

相关·内容

  • iOS表视图单元格高度自适应

    iOS表视图高度自适应可以节省很多麻烦,尤其是涉及到复杂的业务逻辑,今天尝试了使用Masonry和FDTemplatelayoutCell来布局表视图单元格,从而达到单元格高度自适应的效果,这里就总结了这其中使用的要点和注意问题...我们需要做的就是使用Masonry对视图单元格中的位于最底部的视图设置bottom约束,使其能够确定距离单元格最低端的距离。...使用的时候关键步骤包括: 1、注册表视图单元格 这里分为NIb文件和普通类文件的单元格注册,我使用的是xib文件创建的单元格,代码如下: - (UITableView *)tableView{...; } return _tableView; } 2、返回单元格高度 返回单元格高度我们就不必计算了,使用如下的方法来返回 //单元格高度 - (CGFloat)tableView:(...回调中要设置数据 cell.dataDic = self.dataSource[indexPath.row]; }]; } 二、遇到的问题: 1.Masonry设置的约束无效 我们要确定设置单元格子视图约束是相对于

    1.8K70

    iOS 9 Storyboard 教程(二下)

    拖拽一个新的 TableViewController到Main.storyboard里.在AddPlayerscene里选择Game的单元格(确保你选择的的是整个单元格,而不是标签)并且按住ctrl并拖线到新的新的...设置单元格的样式为Basic,然后设置它的重用标识符为GameCell.你需要为这个控制器所做的就是这些. ?...这个方法在点击之后就会取消选中.那使得它从灰色高亮褪色为正常的白色.然后它就会从先前选中的单元格移除对号标记,然后把对号放到刚刚点击的那一行上....= game } } 不管何时名称发生改变,didSet将会在静态表单元格里显示游戏的名称....在Main.storyboard里,按住ctrl把tableview单元格拖拽到Exit,就想你之前做的一样,然后从弹框中选择unwindWithSelectedGame:. ?

    2.2K10

    iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell)

    之后,Xcode将添加这个属性到PlayersDetailViewController类里而且会和storyboard相连: 在表的单元格里创建视图的连线正是我所说的你不应尝试用原型单元格,而用静态单元格是可以的....每一个静态单元格都只有一个实例,所以它完全是可以接受的在视图控制器里通过连线连接它们的子视图....对象.在按住ctrl并拖拽到PlayerDetailsViewController.swift文件的时候,你也许需要点击几次才能选中这个标签(而不是整个单元格).一旦完成了,它就会像下面这样: Paste_Image.png...对象,在运行时期间将不会起作用,原因是因为UITableViewController提供了一个负责静态单元格数据源的额外机制.Xcode为了防止你编译这个工程,甚至会输出错误信息:”(非法的配置:静态表视图只在嵌入到...tableView视图控制器里起作用. ---- Note: 如果你创建了一个有很多静态单元格的控制器–很多都适合可见的frame–然后你可以用鼠标或触摸板滑动手势(2指点击)滑动它们在Interface

    3.3K10

    自学Swift之路(二)UITableView自定义和实际利用

    self.presentViewController(buildListNVC, animated: true, completion: nil) } } 在登录我们会进入一个表视图...,这个表视图单元格是咱们自己定义的 import UIKit class BuildListTableViewCell: UITableViewCell { var logoImgView...aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 代码中自定义的单元格加上了一个...ImageView和一个Label,虽然数据是死的,但是在Swift中,另外一个类是可以直接访问另一个类中的变量的(如果没做任何保护的话),所以我们在配置cell的时候是可以直接赋值的,这里就不弄了,然后我们看创建表视图那一块...} } 创建单元格的时候直接使用我们自定义的BuildListTableViewCell创建就行了 好了,这篇文章也完了,这只是一个非常简单的demo,大家平时工作要做的肯定不止这么点的,哈哈哈

    2.3K90

    Swift - 给TableView添加编辑功能(删除,插入)

    [indexPath.row] print("str\(str)") } // 设置单元格的编辑的样式 func tableView(_ tableView: UITableView, editingStyleForRowAt...{ return "确认删除" } // 单元格编辑的响应方法 func tableView(_ tableView: UITableView, commit editingStyle:...tableView.reloadData() } } 功能改进 (1)默认情况下所有单元格都无法进行滑动删除等编辑操作。...(2)长按表格进入编辑状态,所有单元格都可以进行删除操作。 (3)同时在编辑状态下,在下方会自动出现一个新增操作单元格。点击前面的加号,便会给数据集中添加一条新数据。 ?...{ return "确认删除" } // 单元格编辑的响应方法 func tableView(_ tableView: UITableView, commit editingStyle:

    3K20

    Ios常用第三方动画框架(三)

    JGTransitionCollectionView - swift,基于集合视图扩展实现完成自动布局及单元项 Flip式动画效果(效果很赞)。...Context-Menu.iOS - 可以为app的菜单添加漂亮的动画内容,可自定义icon,并可根据自己的喜好设计单元格和布局。...UnReadBubbleView - UnReadBubbleView是一个能够拖拽并拉长的气泡视图。拖拽到一定的长度会消失,可以通过系数设置来控制拖拽的长度。气泡也支持多种属性设置。...用于简化实现各种类型的旋转木马(分页滚动视图),无限轮播 ,iOS开发之多图片无缝滚动组件封装与使用。 KIPageView - 无限循环PageView,横向TableView,无限轮播。...KYAnimatedPageControl - 除了滚动视图PageControl会以动画的形式一起移动,点击目标页还可快速定位。支持两种样式:粘性小球和旋转方块。

    9.1K30

    【iOS7一些总结】9、与列表显示(在):列表显示UITableView

    视图所定义的协议方法由代理方法delegate和数据源方法data source方法组成。 托付方法一般用于实现个性化处理表视图的基本样式(如单元格的高度等)以及捕捉单元格选中的响应。...如指定单元格数。以及创建每个单元格。 要实现代理和数据源方法。首先须要让当前视图控制器支持UITableViewDelegate和UITableViewDataSource协议。...创建完毕,将tableView的delegate和dataSource设置为self,即托付给当前视图控制器来控制表视图的数据显示和响应。...,假设没有闲置的单元格。...參数indexPath表示眼下正在创建的单元格位于整个表视图的第几行。 编译。执行,显示结果: 假设希望实现对选中某个单元格的响应,仅仅须要实现以下代理方法就可以。

    1.9K40

    自学Swift之路(一)UI入手之基本控件

    对基础不够了解的同学可能不太适合,另外本系列文章不是以教程式的形式来写,是记录学习过程的,所以不会有多少讲解 第一步:创建工程 A62A869C-6B27-46C7-96A7-77BF0FB21C66.png 创建好工程,...我们会进入这个界面 C18EA84A-89AF-4920-8824-1CF1F2CA8B8C.png 好了开始编程:写一个创建子视图的方法,里面创建一些基本的UI控件,然后在viewDidLoad中调用...myImgView.frame = CGRectMake(200, 200, 100, 100) } 写到这里,我想有OC经验的开发者已经发现,两种语言控件的属性是一样的,只是语法有些不一样而已,多写几个就会发现Swift...} 当然,别的方法也是一样,如点击单元格: func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath...) { print("点击了单元格") } 好了,这篇文章的内容就到这里了,下一篇文章将会围绕UITableView,自定义UITableViewCell来写点可视化内容较强的东西

    2.9K110

    提高效率 |ArcGIS Pro 中所有快捷键一网打尽

    复制单元格中所选的值。 Ctrl+V 粘贴所选内容。 将复制的值粘贴到单元格。 F2 编辑单元格。 编辑当前单元格的内容。 Esc 取消操作。 取消编辑值并将原始值恢复到单元格。...Ctrl+Shift+G 选择组,自动布置组元素。 Ctrl + 右箭头 展开模型中的选定组。 Ctrl + 左箭头 折叠模型中的选定组。...如果选择了多个行,会从活动单元格所在的行开始移动。这在按顺序逐条处理表记录、查看或编辑各条记录及在地图上查找其表示的要素尤为有用。 Ctrl+U 或 Ctrl+单击左上方单元格 切换选择内容。...Ctrl+等号 (=) 将视图缩放至活动要素并使其闪烁。 双击记录左侧的灰色单元格。 缩放至要素并将其选中。 Ctrl+双击记录左侧的灰色单元格。 平移至要素并将其选中。...Ctrl+V 将剪贴板中的内容粘贴到单元格单元格区域中。 F2 编辑单元格的内容。 Enter 提交当前编辑。 Esc 取消单元格中的编辑并恢复原始值。

    1K20

    DTCoreText的集成与使用目录一、相关资源二、DTCoreText的集成三、DTCoreText的使用四、可能遇到的错误五、参考链接

    imageInfo withString:newImageInfo]; self.html = newHtml; } } //使用HtmlString,和预设的Frame,计算富文本视图自适应的高度...通过这个单元格类,我们可以方便的设置富文本以及获取单元格高度。以下是使用DTAttributedTextCell显示富文本的核心代码: 3.1....; @end 3.2.表视图代理方法返回单元格及其高度 //代理方法:返回单元格 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath...并更新单元格上的数据 //ZSDTCoreTextCell是自定义的继承于DTCoreTextCell的单元格 - (ZSDTCoreTextCell *)tableView:(UITableView...return; } //如果当前表视图没有在滑动,就手动刷新当前在屏幕显示的单元格 NSArray *indexPaths = [self.tableView indexPathsForVisibleRows

    4.8K90

    iOS小经验:UITableView&UICollectionView设置单元格的默认选中状态

    场景需求 一个表格视图(或者宫格视图)中,当一个单元格被选中设置彩色样式,选中其它单元格设置灰色样式。 2. 一个思路 通过实现选中和非选择的代理,以在适当的时机进行UI更新操作。 3....非选中 - (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated; 注意的是: 上述代码强制设置某单元格选中或者不选中那一刻...(void)deselectItemAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated; 注意的是: 类似的,上述代码强制设置某单元格选中或者不选中那一刻...4.3 补充:代码设置选中状态 执行方法的主体:cell对象 - (void)setSelected:(BOOL)selected; 注意的是: 类似的,这种方法改变cell的选中状态,当屏幕选中其它...手动执行代理 上述两张方案的区别在于,设置选中状态完,屏幕点击其它cell,一个执行原cell的didDeselect方法,一个不执行。

    3.6K50

    【IOS开发基础系列】Storyboard专题

    在以前,如果你要定制表视图单元格,你要么在代码中向cell对象添加自己的 subviews ,要么新建一个 nib 然后从nib 中加载你自己的 cell。...但模板 cells 的出现简化了这一切,现在你可以直接在故事板编辑器中设计你自己的表视图单元格。...但我想在单元格右边加一张图片以显示玩家级别(以星级的形式)。UITableViewCell的标准样式中不包含可以在单元格中放入一个ImageView,因此我只能选择定制设计。         ...如你所见,当你的数据源用 dequeueReusableCellWithIdentifier向 Table View 请求新的单元格TableView并不真正把模板 cell 给你,它只是给你一份模板...其次,你应当确保添加的内容能自动适应单元格尺寸的变化。例如,当你需要表格行能够被删除或移动 ,Cell 尺寸会发生改变。

    1K30

    C++ Qt开发:StandardItemModel数据模型组件

    Model/View 是Qt中的一种数据编排结构,其中Model代表模型而View则代表视图视图是显示和编辑数据的界面组件,而模型则是视图与原始数据之间的接口,通常该类结构都是用在数据库中较多,例如模型结构负责读取或写入数据库...数据模型组件通常会配合TableView等相关组件一起使用,首先绘制UI界面,界面中包含顶部ToolBar组件,底部是一个TableView视图表格,最下方是一个PlainTextEdit文本框,如下图所示...创建状态栏组件,包括显示当前文件、当前单元格位置和单元格内容的QLabel组件。...,并将当前单元格变化刷新到底部的StatusBar组件上,代码如下所示; // 【选中单元格响应】:选择单元格变化时的响应,通过在构造函数中绑定信号和槽函数实现触发 void MainWindow::...,点击打开按钮可以选择项目中的data.txt文本文件,此时就可以将文本中的内容映射到组件中,其输出效果如下图所示; 1.3 保存文件 接着我们来看下保存文件与预览TableView视图的实现方法,其实保存文件与预览是一个功能

    33610

    CC++ Qt StandardItemModel 数据模型应用

    QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,Model/View 是Qt中的一种数据编排结构,其中Model代表模型,View代表视图视图是显示和编辑数据的界面组件...,而模型则是视图与原始数据之间的接口,通常该类结构都是用在数据库中较多,例如模型结构负责读取或写入数据库,视图结构则负责展示数据,其条理清晰,编写代码便于维护。...MainWindow::~MainWindow(){ delete ui;}初始化时同时需要绑定一个on_currentChanged(QModelIndex,QModelIndex)信号,当用户选中指定单元格相应用户...:"+aItem->text()); //显示item的文字内容 }}当页面被初始化时,默认界面如下:图片打开并填充组件: 当工具栏中打开文件被点击则触发,打开文件通过aFile.open打开...,循环读入文件,并将文件中的内容逐行追加到QStringList fFileContent中,当追加完毕,直接调用iniModelFromStringList(fFileContent);完成对页面TableView

    1.6K30

    CC++ Qt StandardItemModel 数据模型应用

    QStandardItemModel 是标准的以项数据为单位的基于M/V模型的一种标准数据管理方式,Model/View 是Qt中的一种数据编排结构,其中Model代表模型,View代表视图视图是显示和编辑数据的界面组件...,而模型则是视图与原始数据之间的接口,通常该类结构都是用在数据库中较多,例如模型结构负责读取或写入数据库,视图结构则负责展示数据,其条理清晰,编写代码便于维护。...setMinimumWidth(180); LabCellPos->setAlignment(Qt::AlignHCenter); LabCellText = new QLabel("单元格内容...MainWindow::~MainWindow() { delete ui; } 初始化时同时需要绑定一个on_currentChanged(QModelIndex,QModelIndex)信号,当用户选中指定单元格相应用户...:"+aItem->text()); //显示item的文字内容 } } 当页面被初始化时,默认界面如下: 打开并填充组件: 当工具栏中打开文件被点击则触发,打开文件通过aFile.open

    1.7K20
    领券