使用 NSFetchedResultsController 在空表上自定义单元格

2023-12-19

当我的 UITableView 为空时,我试图放置一个自定义的空单元格。

我使用以下代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    int count = [self.fetchedResultsController fetchedObjects].count;
    if (count == 0) {
        return 1;
    }
    return count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = nil;
    int count = [self.fetchedResultsController fetchedObjects].count;
    if (count == 0) {
        // return empty cell
        cell = [self getEmptyCellOfTableView:tableView cellForRowAtIndexPath:indexPath];
    } else {
        cell = [self getMyQuestionCellOfTableView:tableView cellForRowAtIndexPath:indexPath];
    }
    return cell;
}

FRC 更改对象执行:

- (void)controller:(NSFetchedResultsController *)controller
   didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath
     forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{       
    if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
    {
        switch(type)
        {
            case NSFetchedResultsChangeInsert:
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeDelete:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeUpdate:
                [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeMove:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;
        }
    }
}

这工作得很好,问题是当fetchedObject.count > 0比我得到以下错误:

CoreData: error: Serious application error.  
An exception was caught from the delegate of NSFetchedResultsController during a call to -
controllerDidChangeContent: Invalid update: invalid number of rows in section 0.
The number of rows contained in an existing section after the update (1)
must be equal to the number of rows contained in that section before the update (1),
plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) 
and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). 
with userInfo (null)

我知道发生这种情况是因为我插入了 1 个新行,并且计数保持在 1 而不是变成 2。

我该如何修复它以适应我的行为?


表视图更新后,返回的值numberOfRowsInSection必须准确地 匹配之前的行数加上插入的行数减去已插入的行数 已删除的行。

在您的情况下,当插入第一个对象时,insertRowsAtIndexPaths在新对象的 FRC 委托方法中调用,但不是显示附加行,而是“空” 细胞是replaced使用不同的单元格,因此行数仍然是一。

如果你修改 FRC 委托方法,它应该可以工作controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:如下:

case NSFetchedResultsChangeInsert:
    if ([[self.fetchedResultsController fetchedObjects] count] == 1) {
        // First object inserted, "empty cell" is replaced by "object cell"
        [tableView reloadRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else {
        [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    break;

case NSFetchedResultsChangeDelete:
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) {
        // Last object removed, "object cell" is replaced by "empty cell"
        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else {
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
    break;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSFetchedResultsController 在空表上自定义单元格 的相关文章

  • iOS 发送 iMessage 尽可能简单

    我希望能够以编程方式发送 iMessage 除了调用一个将文本发送到带有消息的号码的函数之外 无需执行任何其他操作 这两个消息都是文本框 我真的很感激一些示例代码 因为我在网上搜索过 但我发现没有任何帮助 这不适用于商业应用程序 仅适用于我
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在 Mac OS X 应用程序上找到 Core Data 的 sqlite 数据库

    在哪里可以找到 Mac OS X 应用程序的 Core Data sqlite 数据库 我找到了它 但它是 momd 文件夹 包含 3 个文件 VersionInfo plist mom omo 我怎样才能看到它的内容 在 OS X 10
  • 在两个数字之间设置 UILabel 文本动画?

    我是 iPhone 和 Mac 编程新手 之前为 Windows 开发过 我有一个问题 我如何制作动画text的财产UILabel两个数字之间 例如从5 to 80以 Ease Out 风格 是否可以与CoreAnimation 我已经在谷
  • 多个 ViewController(containerView?childView?viewController 的实例?)

    我需要在另一个视图之上添加一个新视图 带有 ViewController 用户与这个新视图交互了一段时间 然后我想将其删除 在旧版本的 Xcode 中 我可以将其添加为子视图 我现在收到 EXC BAD ACCESS 错误 我不希望添加的视
  • 在 iOS 上的 SceneKit 中导入 3d 模型

    从 URL 导入 obj 文件并将其转换为 SCNNode 时遇到问题 这是代码 swift3 let url URL init string https cloud box com shared static ock9d81kakj91d
  • 检测 UITableView 中的水平平移

    我正在使用 UIPanGestureRecognizer 来识别 UITableView 中的水平滑动 准确地说是在单元格上 尽管它已添加到表格本身 然而 这个手势识别器显然窃取了桌子上的触摸 我已经让 pangesturerecogniz
  • CocoaPods 生成无效的项目文件(未找到标头)

    我有一个带有 Podfile 的项目文件 如下所示 platform ios 7 0 def import pods pod Specta 0 1 8 pod Expecta 0 2 1 pod RestKit 0 20 3 pod Mag
  • 是否可以使用 iOS SDK 更改 Amazon Cognito 中的用户名?

    正如标题中所写 是否可以更改 Amazon Cognito 用户的用户名 我在文档中找不到任何内容 可以更新preferred username使用 iOS SDK 的 Cognito 用户 使用updateAttributesAPI 调用
  • 删除部分(红色删除按钮),UITableViewController - iOS

    我正在尝试做一个分组的 uitableview 并且我已经激活了编辑选项 我希望用户也能够删除整个部分 而不仅仅是特定行 因此 当您单击 编辑 时 每个表格单元格左侧显示的红色减号按钮也应该显示在各个部分 部分标题左侧 有人知道如何做到这一
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • 在 swift 中设置状态栏的自定义颜色?

    在视图控制器上 我想将状态栏的颜色设置为黑色 但我无法更改它 我为此目的使用下面的代码 func setUpUI self navigationController setNavigationBarHidden true animated
  • NSPredicate 使用 RLMResults 作为参数

    我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据 并且是不同的对象 之间的差异 但存在一个我无法理解的错误 我的代码 RLMResults topStories KFXTopStory allObjects NS
  • RxSwift、RxCocoa 和 UITableview

    我在使用 RxSwift 实现 UITableView 时遇到问题 我尝试使用以下代码将模型数组的可观察对象绑定到表项 models bind to self tableView rx items cellIdentifier Cell c
  • OpenGL ES 1.1 顶点缓冲区对象不工作

    我正在使用 OpenGL ES 1 1 开发一款 iPhone 游戏 需要使用顶点缓冲区对象来渲染 500 多个粒子而不降低性能 我的游戏能够使用非 VBO 方法成功绘制 但现在我尝试合并 VBO 却不再绘制任何内容 请帮助我找出我做错了什
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • 为什么我们需要将 delegate 设置为 self?为什么编译器不默认它?

    I think我完全理解授权的概念 我的问题是 当我们这样做时 class someViewController UIViewController UITableViewDelegate 会吗ever可能我们不想设置tableView de
  • 在 iPhone 模拟器中从硬盘读取文件

    是否可以将文件 从我的普通文件系统 读入在 iPhone 模拟器上运行的 iPhone 应用程序 据我所知 iPhone 本身没有 用户可访问的 文件系统 但这只是为了测试 并且只能在模拟器中运行 该文件将是一个可以在应用程序运行时编辑的文
  • HTML5 地理定位 - 在 iOS 上无法始终工作

    目前正在使用 HTML5 地理定位 我已经在所有网络浏览器上测试了它 它似乎工作正常 然而 当我在 iPad 上测试地理定位时 它在 iPad mini 上始终有效 但当我将其放在更大的 iPad iPad 2 上时 位置似乎并不总是有效

随机推荐

  • 捕获 Excel 数据透视表刷新事件

    是否有与数据透视表的数据刷新相对应的事件 我已经找到了 worksheet pivottableupdate 事件 但这似乎每次我更改过滤器或操作数据透视表时都会被调用 这在我的宏中非常频繁 我需要的只是捕获底层数据何时更新 有办法做到这一
  • 隐式运算符和类型转换器是否等效?

    在我看来 实现隐式运算符与 TypeConverter 似乎非常容易 因此我假设它们并不等效 因为框架中 TypeConverters 的流行 请参阅扩展 FrameworkElement 的任何内容 但为什么 创建 string gt o
  • 通过 HTTP 传输文件的 Response.TransmitFile 的替代方案

    我正在开发一个允许用户下载文件的 ASP NET 网站 以前 文件存储在与网站相同的服务器上 因此我们可以执行以下操作 Response Clear Response AddHeader Content Disposition attach
  • WinForms - 本地化 - UI 控件在其他文化中的位置不同

    我做了 UI 设置 原始语言是英语 之后我将 Localized 属性设置为 True 将原始 resx 文件复制到 frmMain de De resx 例如 翻译所有字符串 一切正常 但现在我想改变控件的位置 之后变化可见only原始
  • React-native --variant 选项

    可能的值是什么 variant选项除了release 它记录在哪里 我在反应本机文档中找不到 我应该指定这个选项吗debug or devDebug调试构建的价值 thanks 只有两个选择 release and debug 默认vari
  • 如何从文本文件中删除 ^M 并将其替换为下一行

    假设我有一个包含以下内容的文本文件 Hello what is up M M What are you doing 我想删除 M并将其替换为下面的行 所以我的输出看起来像 Hello what is up What are you doin
  • 为所有用户添加一个键到 HKEY_CURRENT_USER

    我有一个安装程序 它在 HKEY CURRENT USER 上安装一个密钥 当我运行安装程序时 它仅将其添加到正在安装的用户上 有没有办法一次性为所有用户添加密钥 Thanks 你必须遍历所有不同的用户HKEY USERS 这需要更高的权限
  • 使用 ls 按一定顺序 scp 文件

    每当我尝试 SCP 文件 在 bash 中 时 它们最终都会以看似随机 的顺序出现 我找到了一种简单但不太优雅的方法来保持所需的顺序 如下所述 有聪明的方法吗 Edit 从这里删除了我早期的解决方案 使用其他建议进行清理 调整 并添加为下面
  • 如何在Linux中创建名称以破折号开头的文件? (例如“-文件”)

    如何在 Linux 中使用命令行创建名为 file 的文件 在其前面指定一个路径 例如 file
  • 从 GCP HTTP 函数调用启动后台进程的最佳方式?

    所以 根据这里的文档https cloud google com functions docs writing http https cloud google com functions docs writing http 终止 HTTP
  • 使用OpenGL ES纹理缓存而不是glReadPixels来获取纹理数据

    在 iOS 5 中 引入了 OpenGL ES 纹理缓存 以提供从相机视频数据到 OpenGL 的直接方式 而无需复制缓冲区 里面有关于纹理缓存的简单介绍会议 414 WWDC 2011 的 iOS 5 OpenGL ES 进展 http
  • 使用 GraphicBuffers 快速读取纹理

    我正在编写一些使用着色器在 Android 上运行一些 GPGPU 代码的代码 通常是一个Framebuffer使用因此计算结果存储在纹理中 输入数据通常也是纹理 为了提高性能 最好摆脱glTexImage2D and glReadPixe
  • sorted() 仅按第一位数字排序[重复]

    这个问题在这里已经有答案了 我需要对表格的第一列进行排序 它看起来像 6000 799 7000 352 8000 345 9000 234 10000 45536 11000 3436 1000 342 2000 123 3000 123
  • Android:导航抽屉和 ActionBar 兼容

    我开始与导航抽屉 using 动作栏夏洛克并取得了良好的结果 但我的公司不太可能很快批准这个开源 所以我正在努力切换到 ActionBarCompat ActionBar兼容昨天 2013年7月24日 刚刚正式发布 有人让两者能够很好地合作
  • Android:创建一个带有图像但没有文本的切换按钮

    是否可以在 Android 中创建一个有图像但没有文本的切换按钮 理想情况下它看起来像这样 我看过类似的帖子 答案是更改背景 但我想保留 Holo Light 布局 只需将文本与图像交换 我需要能够以编程方式更改图像源 我有什么想法如何做到
  • GA GEO 图表城市标记不正确

    我有一个连接到谷歌分析帐户的页面 在该页面上 我有一张关注佛罗里达州的 GEO 图 当我将鼠标悬停在地图上的标记上时 大约一半的标记看起来是正确的 另一半的城市名称与地图上的标记不符 例如 该州中部的标记被标记为巴西的城市 例如 请参见下面
  • PHP 检查用户是否在线

    谁能告诉我为什么这不起作用 在我的数据库中lastactive is 2013 12 10 16 15 12 每次用户刷新我网站上的任何页面时都会更新 我选择它并将其设置为变量 lastactive row 5 这是我认为它应该起作用的地方
  • 使用 Typescript+VSCode 调试 Node.js 异步/等待

    我检查了以下答案 Nodejs 7 的异步等待 https stackoverflow com questions 41347260 async await with nodejs 7 如何在 Visual Studio 代码中调试异步 等
  • 如何使用 lldb(或 gdb)调试 Clang 插件

    我想调试 Clang 插件 但是 我找不到有关 Clang 插件调试的信息 如果您知道如何调试 Clang 插件 您能告诉我这些信息吗 谢谢 只是一个小轮廓 因为我自己在自动取款机上尝试 我正在使用lldb 我目前可以停止在插件中的任何给定
  • 使用 NSFetchedResultsController 在空表上自定义单元格

    当我的 UITableView 为空时 我试图放置一个自定义的空单元格 我使用以下代码 NSInteger tableView UITableView tableView numberOfRowsInSection NSInteger se