在 UITableViewController 中重新排序行后 UI 更新不正确

2024-05-16

因此,我对表中的行重新排序,用户界面最终结果不正确。场景如下:

表内容原文:

a
b
c
d
e

如果我移动第 0 行(当前a)到第 4 行(当前e),我看到的最终结果是:

c
d
e
a
a


一些背景:

该表正在读取 Realm 对象的列表。我确认 Realm 对象也已正确更新。如果我放一个tableView.reloadData()对行重新排序后,我可以获得正确的 UI 结果。但是,重新加载数据会给我的应用程序带来不必要的 UI 动画。下面是我执行重新排序的代码:

let realm = try! Realm()
realm.beginWrite()
let itemToMove = self.itemList?[fromIndexPath.row]
self.itemList?.remove(at: fromIndexPath.row)
self.itemList?.insert(itemToMove!, at: toIndexPath.row)
try realm.commitWrite()


我有对不读取 Realm 对象的表中的行进行重新排序的成功经验。所以我不确定这是否与 Realm 有关。我已经研究了很多,但没有真正看到任何类似的问题。任何帮助将不胜感激!


因此,Realm 对象作为表视图的数据源的棘手之处在于,我需要协调 Realm 对象的更新(without发生重新排序时通知通知令牌)以及表视图。

从官方 Realm Swift 文档中,记录了一个功能来使用更新 Realm 对象commitWrite(withoutNotifying: [token])。我经历了一些挣扎,直到我发现这是最近发布的新功能,而我的 Realm 版本有点过时。这就是为什么当我输入该函数时,Xcode 会抱怨。安装Realm 2.2.0后,该功能立即出现。

下面是我对行重新排序的代码:

do {
    self.itemList?.realm?.beginWrite()

    self.itemList?.move(from: fromIndexPath.row, to: toIndexPath.row)
    self.tableView.moveRow(at: fromIndexPath, to: toIndexPath)

    try self.itemList?.realm?.commitWrite(withoutNotifying: [self.notificationToken])
} catch let error as NSError {
    fatalError(error.localizedDescription)
}

问题的一点后续:
表视图中奇数行的背景颜色最初设置为灰色(只是一些 UI 功能)。但是,重新排序后,正在移动的行的背景颜色不会更新。我尝试过tableView.reloadData() and tableView.reloadRows()。但最后一行不知何故以一种奇怪的状态结束,无法再编辑。所以基本上,如果我想再次对表重新排序,最后一行将不会显示在“编辑”状态/视图中。我仍在尝试理解并解决这个遗留问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UITableViewController 中重新排序行后 UI 更新不正确 的相关文章

随机推荐

  • VS2010中如何切换头文件和实现?

    Visual Studio 2010 中是否有允许在标头 C C h 文件 和实现 C C cpp 文件 之间切换的键盘快捷键或免费插件 MS added this feature in Visual Studio 2013 It s a
  • 删除匹配前的一个单词和一个单词

    匹配之前的一个单词可以是一组任何符号 例如 D E F 我有一个正则表达式 s w s XXX 输入示例 This is KKK M D D xXx PPP输出示例 This is KKK PPP 所以我需要删除 XXX 之前的 1 个单词
  • 提升变量有目的吗?

    我最近学习了很多 JavaScript 并且一直在尝试理解提升变量的值 如果有的话 我 现在 明白JS是一个两遍系统 它编译然后执行 另外 我知道 var 关键字 存在 在它声明的词法范围中 因此如果在引擎为其赋值之前调用它 那么它是 未定
  • RStudio 不会通过 rPython 调用加载所有 Python 模块

    我从 Bash 和 RStudio 中运行相同的脚本时出现一些意外行为 请考虑以下事项 我有一个文件夹 rpython 包含两个脚本 test1 R library rPython setwd rpython python load tes
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • 如何通过 C API 在自己的环境中执行不受信任的 Lua 文件

    我想通过调用在其自己的环境中执行不受信任的 lua 文件lua setfenv http pgl yoyo org luai i lua setfenv这样它就不会影响我的任何代码 该函数的文档仅解释了如何调用函数 而不解释如何执行文件 目
  • (AD) ldap 领域中的组成员资格

    我在 java ee 企业应用程序中使用 JAAS 框架进行身份验证和授权过程 我使用 GlassFish 作为应用程序服务器 我的领域配置如下所示
  • CSS 未在 Django 项目中加载?

    我是 Django 新手 但负责该项目的前端工作 我一直在研究如何准确加载 css 文件 但我发现这些方法不起作用 这是 html 文件布局 load static
  • 迁移到 Jakarta EE:无法找到 URI 的 taglib [c]:[jakarta.tags.core] [重复]

    这个问题在这里已经有答案了 我尝试从 Spring 5 升级到 Spring 6 并收到以下错误 Unable to find taglib c for URI jakarta tags core 我的 pom 中有以下内容
  • Internet Explore 8 不会使用 .attr() 更改图像 src

    我设置了一个页面 当用户用鼠标或触控板滚动时 该页面将快速浏览一系列图像 我使用 jQuery 来测量距页面顶部的距离 scrollTop 然后更改 DOM 中特定 id 的图像源 这在 Firefox Chrome Safari Oper
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 谷歌地图url如何定义圆形标记?

    我想打开默认地图应用程序 但我想要一个圆形标记 而不是默认标记 这就是我所拥有的 case Device Android if string IsNullOrEmpty imovel Endereco Freguesia uri new U
  • pip/easy_install 失败:创建进程失败

    关注这篇文章后 如何在 Windows 上安装 pip https stackoverflow com questions 4750806 how to install pip on windows在我使用 Enthought Canopy
  • 仅在配置时才在 Vagrantfile 中运行代码

    我想在运行时在屏幕上显示一些文本vagrant up or vagrant provision etc 当且仅当正在配置 为了vagrant up它仅在第一次运行 或者如果特别强制 provision 如何才能做到这一点 添加 shell
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • 在 JavaScript 中检测页面是否加载到 WKWebView 中

    如何使用 javascript 可靠地检测到页面已加载到 WKWebView 中 我希望能够检测到这些场景 iOS 和 WKWebView iOS 和 Safari not iOS 关于 UIWebView 有一个类似的问题here htt
  • WPF 模式进度窗口

    如果这个问题已经被回答了很多次 我很抱歉 但我似乎找不到适合我的答案 我想创建一个模式窗口 在我的应用程序执行长时间运行的任务时显示各种进度消息 这些任务在单独的线程上运行 我能够在过程的不同阶段更新进度窗口上的文本 跨线程通信一切正常 问
  • 如何让球拍不打印?

    我正在 Racket 中编写一个程序 我正在使用它运行racket foo rkt 这是可行的 除了程序顶层每个表达式的结果都会被打印 即使没有调用打印函数 就好像程序是逐行输入到 REPL 中的 但在这种情况下 我根本不尝试使用 REPL
  • Postgres LIMIT/OFFSET 奇怪的行为

    我正在使用 PostgreSQL 9 6 我有一个这样的查询 SELECT anon 1 id AS anon 1 id anon 1 is valid AS anon 1 is valid anon 1 first name AS ano
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认