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

当重新排序TableView和节标题高度变为零时,数据源不更新

当在iOS开发中遇到TableView重新排序后节标题高度变为零的问题,通常是因为TableView的数据源没有正确更新以反映新的顺序。以下是解决这个问题的基础概念和相关步骤:

基础概念

  • TableView: iOS中的一个控件,用于展示列表形式的数据。
  • 数据源: TableView的数据来源,负责提供显示内容和节标题。
  • 节标题: TableView中每个分节的头部标识。

问题原因

当TableView的内容重新排序后,如果数据源没有同步更新,TableView将无法正确获取新的节标题和内容,可能导致节标题高度显示为零。

解决方案

  1. 更新数据源: 在重新排序TableView后,确保你的数据源数组也按照相同的顺序进行了更新。
  2. 刷新TableView: 调用TableView的reloadData方法可以刷新整个TableView,但这可能会导致性能问题。更好的方法是只刷新受影响的节或行。
  3. 使用正确的刷新方法: 如果你知道具体哪些节或行发生了变化,可以使用reloadSections(_:with:)reloadRows(at:with:)方法来局部刷新TableView。

示例代码

假设你有一个数组dataArray作为TableView的数据源,并且你想要重新排序这个数组并更新TableView。

代码语言:txt
复制
// 假设这是你的数据源数组
var dataArray = [YourDataType]()

// 重新排序数组的函数
func reorderDataArray() {
    // 这里执行你的排序逻辑,例如:
    dataArray.sort { $0.someProperty < $1.someProperty }
    
    // 更新TableView
    DispatchQueue.main.async {
        self.tableView.reloadData() // 刷新整个TableView
        // 或者如果你知道具体哪些节需要刷新,可以使用:
        // let indexSet = IndexSet(integer: sectionIndex)
        // self.tableView.reloadSections(indexSet, with: .automatic)
    }
}

// TableView的数据源方法
func numberOfSections(in tableView: UITableView) -> Int {
    return dataArray.count // 假设每个数据项对应一个节
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1 // 假设每个节只有一行
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath)
    // 配置cell的数据
    return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    // 返回对应节的标题
    return dataArray[section].title
}

应用场景

这个问题常见于需要动态排序列表的应用,如日程管理、任务列表等,其中用户可能需要重新排列项目的顺序。

通过以上步骤,你应该能够解决TableView重新排序后节标题高度变为零的问题。如果问题仍然存在,可能需要检查TableView的delegate方法是否正确实现,或者是否有其他代码影响了TableView的显示。

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

相关·内容

你可能需要为你的 APP 适配 iOS 11

本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 UIScrollView和UITableView 的更新和功能更强大的滑动操作。 一....(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。...,大标题会变大来回应那个滚轮 所以,如果你使用navigation bar,组装push和pop体验,你不会得到searchController的集成、大标题的控制更新和Rubber banding效果...就不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的...高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。

1.7K60

iOS开发中行高灵活可变的UITableView的性能优化

TableViewCell配置部分: ④当使用cellID进行与TableView绑定的cell获取时会拉取本行cell的高度数据。 ?...当执行TableView的reloadData方法进行界面刷新时,系统先会把所有行的行高数据拉取一遍,之后和UITableViewCell配置部分的场景一直,会拉取即将出现在屏幕上的cell的行高数据。...并且,每次拉取高度都从代理方法拉取,而不是存入内部的一个变量属性中,避免了因为数据源更改时机巧合而产生的界面与预期不一致的风险。...例如下图所示,左侧的图标进行了与父视图的左侧距离约束,标题Label进行了与父视图的上侧距离约束和右侧距离约束,内容Label进行了与标题Label的上侧约束和与父视图的下册约束,并且对宽度进行了约束。...,用它来作为TableView分区头尾视图的高度返回,系统会自动根据标题是否存在来进行自适应,举个例子,如果返回的标题为nil,则头视图会被自动隐藏,示例代码如下: -(CGFloat)tableView

2K20
  • 你可能需要为你的 APP 适配 iOS11

    本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 UIScrollView和UITableView 的更新和功能更强大的滑动操作。...(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。...就不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的...因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。...滑动操作这里还有一个需要注意的是,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。

    2.5K00

    你可能需要为你的APP适配iOS11

    本文内容包括:集成了搜索的大标题栏、横向选项卡栏、Margins 和 Insets以及 UIScrollView和UITableView 的更新和功能更强大的滑动操作。...(向上滑动后标题会回到原来的UI效果)、横屏状态下tab上的文字和icon会变为左右排列。...就不会一次性计算所有的cell的高度了,只会计算当前屏幕能够显示的cell个数再加上几个,滑动时,tableView不停地得到新的cell,更新自己的contenSize,在滑到最后的时候,会得到正确的...因为不会缓存正确的行高,tableView reloadData的时候,会重新计算contentSize,就有可能会引起contentOffset的变化。...滑动操作这里还有一个需要注意的是,当cell高度较小时,会只显示image,不显示title,当cell高度够大时,会同时显示image和title。

    82920

    macOS开发之NSTableView的应用详解

    也正如前面所说,numberOfRowsInTableView方法为数据源代理必须实现的方法,其中需要返回列表的行数。...(void)sizeToFit; //提供了这个属性,会在列标题那里显示一个排序按钮 点击列标题后可以进行排序操作(会回调相关协议方法) @property (nullable, copy) NSSortDescriptor...=isHidden) BOOL hidden; //设置此列所有行的数据载体视图 如果不设置 默认为NSTextFieldCell @property (strong) id dataCell; //为...如本文开头的示例代码,Cell-Base的TableView必须实现的两个协议方法是numberOfRowsInTableView和objectValueForTableColumn方法,第一个方法设置列表行数...]; return rowView; } //当添加行时调用的回调 - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView

    4.8K21

    iOS UITableView代理方法详解 原

    二、UITableViewDataSourc(数据源代理) 1、必须实现的回调方法 返回每个分区的行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection...)tableView;  设置索引栏标题对应的分区 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle...:(UIView *)view forSection:(NSInteger)section; 设置行高,头视图高度和尾视图高度的方法 - (CGFloat)tableView:(UITableView...:(NSInteger)section; 设置行高,头视图高度和尾视图高度的估计值(对于高度可变的情况下,提高效率) - (CGFloat)tableView:(UITableView *)tableView...,如果不设置,默认都是删除风格 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath

    1.4K40

    iOS-UI控件之UITableView(一)

    的高度 self.tableView.rowHeight = 100; // 设置每一组头部的高度 self.tableView.sectionHeaderHeight = 50...; // 设置每一组尾部的高度 // self.tableView.sectionFooterHeight = 50; // 设置分割线颜色 self.tableView.separatorColor...连线 代码 实现数据源方法 先调多少组 //调用数据源的下面方法得知一共有多少组数据 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView...; 多少行 //调用数据源的下面方法得知每一组有多少行数据 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(...UITableViewCell对象 不优化时内存分析 不优化的时候 离开可视范围就销毁 频繁的开辟内存,销毁内存 - (UITableViewCell *)tableView:(UITableView

    1.8K130

    iOS 9 Storyboard 教程(一下)

    现在的Table View Controller有一个空的原型cell.点击原型cell,你可以在Attributes inspector中设置它的样式(Style)和副标题(Subtitle)....如果你之前使用过table view,兵器手动创建过cell,你可能会认出这是UITableViewCellStyle.带副标题(Subtitle)的样式.和原型cell一样,你也可以选择一个内置的cell...运行app,但是好像却没有任何改变…并不是很奇怪:你还必须为tableView添加数据源,这样它才会知道应该显示多少行数据.这正是你接下来要做的....: 如果你事先不知道你的cell的高度,或者不同的cell有着不同的高度,你将会使用 tableView(tableView:heightForRowAtIndexPath:). ---- 返回Main.storyboard...player的属性,它都会正确地更新IBOutlet里的信息.

    3.1K20

    史上最全的iOS之访问自定义cell的textField.text的N种方法

    这样就可以在监听到通知后调用的方法中,根据indexPath来区分不同的section和row。...内容进行重新配置或者清空(根据自己的业务场景而定) 以下是方法二的demo地址 方法三(发送自定义通知) 其实方法三和方法二很像,都需要给自定义的textField添加indexPath属性,也需要发送通知...重新配置。...if (indexPath.section == 0) { customCell.block = ^(NSString * text) { // 更新数据源...内容进行重新配置或者清空(根据自己的业务场景而定) 以下是方法四的demo地址 方法四相对于方法二和方法三的好处在于:方法四没有采用通知的方式来获取contentTextField.text,而是采用灵活的

    6.8K40

    【IOS开发基础系列】Table View开发专题

    的高度减去tabbar的高度就好了。     ...主要就是说自己定义一个view,弄成透明的,然后盖在TableView的上部和下部,这样就“隐藏”了。...44         因为在iOS5的时候, 默认Cell就是320宽(那阵屏幕就是那么宽,然后高度是44) 现在是在layoutSubViews 重新绘制这个cell的宽度和高度,所以才是屏幕上的宽度...常见的现象就是在更新数据时,整个界面卡住不动,完全不响应用户请求。出现这种现象的原因就是主线程执行了耗时很长的函数或方法,在其执行完毕前,无法绘制屏幕和响应用户请求。...,如果cell是可见的,还需要更新图像: NSArray *indexPaths = [self.tableView indexPathsForVisibleRows]; for (NSIndexPath

    38220

    iOS-TableView统一数据源代理

    TableView 是 iOS 应用程序中非常通用的组件,几乎每一个界面都有一个TableView,而我们许多的代码都和TableView有关系,比如数据展示、更新TableView,一些响应选择事件等...的代理,这里我将dataSource和delegate统一为delegate了,并且如果有多个TableView,我们还可以创建多个代理实例与其一一对应 网络请求:这里是做网络请求地方,并且将请求后的数据保存在代理类中...刷新视图 确定cell的类型:cell是通过它注册identifier来创建的,所以根据indexPath来返回相应的cell注册的identifier即可 头部高度:header的高度,可以是定值,...也可以根据section来动态返回 尾部高度:footer的高度,可以是定值,也可以根据section来动态返回 行高:这里的行高可以通过data来获取,这样利于做高度缓存,也可以通过indexPath...来动态返回 配置数据源:这里可以获取的已经初始化号的cell和其对应的数据源,我们只需要将其赋值给cell即可 点击事件 上面这些步骤也不是固定的,这里有链式编程的思想,有些属性可以不设置则会取默认值,

    93410

    Jekyll-Admin-Mac 开发纪要-左侧菜单栏

    宽度是固定的,但是高度不固定,我们使用自动布局。 ? 最上线显示 Logo的地方大小为 205x75。我们采用 NSImageView。我们采用如下的布局。 ?...左侧和父试图对其 上侧和父试图对其 宽度205 高度75 ? ⚠️我们发现我们的图片是正常的显示出来了,但是背景颜色无法显示。那是因为在 OSX开发和 iOS不太一样。...如图所示的版本还不能达到我们的要求,有了标题,而且多了一个 Column。 我们取消显示 Header和设置只有一个 Cloumn ?...我们设置 Xib里面的 NSView的宽度为 205,高度为 49。其实我们这个宽度和高度会随着改变的。 我们在最左侧放置一个 NSImageView布局如下。 ?...我们设置 View的试图按照宽度和高度自动约束。

    2.1K10

    UITableView 组件化

    单调的优化过程 业务继续深入,为了保证相关代码整洁,易于拓展和性能高效,除了维护 model 和 cell 关系(ModelCellMap)外,我们往往需要引入各种类做职责分离:DataSource 管理数据源...数据源和 UI 不绑定 当 model 变化时,我们往往需要通过当前 model 位置反推出 cell 在 UITableView 中的位置(即 indexPath),然后做相应的更新处理,反之亦然。...自动 cell 高度缓存 通过 ListDiff 算法实现的 section 局部刷新 当开启高度缓存选项时,M80TableViewComponent 计算 cell 高度后会自动记录 diffableHash...后续再次刷新将自动获取对应高度而无需再次计算。当一个 cell 有多重状态,需要在不同状态下展示不同高度时,则可以通过业务状态返回不同的 diffableHash 进行高度切换。...在合适的场景下,使用 ListDiff 进行 section 的重新载入,而不是人工计算各种变化信息后进行逐一操作,能够在保证性能的前提下,简化开发过程和良好的界面表现。

    1.5K30

    Python Qt GUI设计:QTableView、QListView、QListWidet、QTableWidget、QTreeWidget和QTreeWidgetltem表格和树类(提升篇—1)

    在QtableView中可以使用自定义的数据模型来显示内容,通过setModel来绑定数据源。...QTableView控件可以绑定一个模型数据用来更新控件上的内容,可用的模式如下表所示: 通过示例了解QTableView类的使用方法,效果如下所示: 实现代码如下所示: from PyQt5.QtWidgets...1','标题2','标题3','标题4']) for row in range(4): for column in range(4): item = QStandardItem(...newItem) newItem = QTableWidgetItem("65") tableWidget.setItem(0, 2, newItem) # 将表格变为禁止编辑...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    3.4K20

    .NET控件集ComponentOne 2018V3发布:新增图表动画及迷你图

    针对各平台,ComponentOne 主要更新点有: WinForm:增加迷你图、数据选择器和更多主题设计 WPF:推出类似 Office 365 风格的功能区 XAML:优化数据排序、过滤和分组功能,...您可以从数据源直接创建过滤器,支持自动生成和手动创建。此外,其基于手风琴面板的 UI 设计还可以附加到共享数据源或插入信息屏幕的任何控件中使用。...xaml2.png ​ AML C1Icon 日程控件 ComponentOne 新的 TableView Scheduler 控件用于在表视图中显示议程,可以按开发人员或最终用户的指定进行分组、排序或筛选...此视图始终默认按日期升序排序,并且没有行标题或列标题。 此外,我们还添加了一个新的“Working Elsewhere”表示预约可用状态(如下图)。...xaml4.png ​ XAML Scheduler AgendaView 以上就是ComponentOne Enterprise 中 WinForm 平台和 WPF 平台的主要更新点,想了解更多 2018V3

    2.5K20

    deleteSections & deleteRows 我踩的坑

    print("我来重新获取 tableView RowsNumber") return 1 } func tableView...通过这点我们能分析出下面几个结论: 1 、每次删除的时候都会重新去获取它的组数和组里面cell的个数。...2、不会重新走 cellForRowAt 所以我们给cell赋的index的值不会更新,所以删除某一个cell的时候。...要是你再这样回调这个index做操作,然后删除数组元素中的某一位置的元素,保证和剩下的section个数是一样的,但是不刷新TableView ,会发生什么呢?...oc也是指针),并没有重新赋值,这时候我们就可以在 model 里面写一个 IndexPath 进去,然后在每一次删除完之后我们自己操作在数据源中重新排列这个model中的indexPath ,在删除点击回调的时候直接回调这个

    1.9K30

    在iOS中怎样创建可展开的Table View?(上)

    正如这个词所暗示的,一个可展开的tableView是一个tableView,它可以"允许"它的cell打开和合拢,显示和隐藏其他的cell,在任何情况下都总是可见.当需要收集简单的数据或者显示用户所需要的信息的时候....它不仅仅被app用来出队合适的cell,而且它也会决定应该采取适当地行动,取决于显示的cell,以及每个cell具体的高度. additionalRows:当一个可以展开的cell被打开的时候,它包含了应该被显示附加行的总数...数据源的一部分....section: Int) -> Int { return visibleRowsPerSection[section].count } 在那之后,让我们设置tableView每组的标题: func...).稍后我们将更改值,以及我们将会更新各自的cell描述符.

    1.8K50
    领券