使用 tableView:moveRowAtIndexPath:toIndexPath: 方法后将新订单保存到核心数据

2023-12-14

我在 Swift iOS 应用程序中有一个 tableView,允许用户对行重新排序。点击“编辑”按钮,可以重新排序或删除行,然后重新点击“编辑”按钮(现在显示为“完成”)以完成该过程。

如果我只是使用 tableView:moveRowAtIndexPath:toIndexPath: 方法,它的工作方式如上所述,并且在点击“完成”时,表会正确显示重新排序的行。但它在返回表时不记得新顺序,因此我在核心数据中添加了一个新的“位置”变量(Int),并且我让表根据该变量自行排序。

我的问题是,在用户移动一行并单击“完成”后,该表立即将其自身重新排序回到之前的状态。因此,在我的代码可以正确捕获新订单并将其重新写入核心数据之前,它正在使用核心数据中的旧(原始)位置变量。

有没有办法在表重新加载之前单击“完成”时捕获此新订单?

这是我处理移动的代码:

func tableView(tableView: UITableView!, moveRowAtIndexPath sourceIndexPath: NSIndexPath!, toIndexPath destinationIndexPath: NSIndexPath!) {
}

这是按下“完成”时调用的代码。我遍历表的每一行,并根据新行重新分配核心数据中人员的位置变量:

for currentIteration in 0..<tableView.numberOfRowsInSection(0) {
    var indexPathForCurrentIteration = NSIndexPath(forRow: currentIteration, inSection: 0)
    let personAtCurrentIndexIteration = fetchedResultsController.objectAtIndexPath(indexPathForCurrentIteration) as PersonModel
    personAtCurrentIndexIteration.position = indexPathForCurrentIteration.row
    println("\(personAtCurrentIndexIteration.name) has a position value of \(personAtCurrentIndexIteration.position)")
    (UIApplication.sharedApplication().delegate as AppDelegate).saveContext()
        tableView.reloadData();
}

当按下“完成”按钮时,会调用上面的方法,但我也尝试在 moveRowAtIndexPath 方法中调用它,但没有成功(相同的结果 - 当按下“完成”按钮时,它会重新加载表的旧顺序)。我也尝试注释掉 reloadData 但没有成功。

我认为我的问题可能在于上面的内容没有捕获新的行顺序,而是仍然获取旧的行顺序。如果是这种情况,那么我不知道让它“等待”获取新行顺序的最简单方法。

我开始考虑的一个较长的解决方法是捕获移动行的初始和最终行值,并据此相应地更新剩余行的值。其中一些代码如下,但我停止了,因为我认为可能有更聪明的方法。

if((sourceIndexPath.row > indexPathForCurrentIteration.row) && (destinationIndexPath.row > indexPathForCurrentIteration.row)) {
    //if the moved row was ahead of this row before AND after the move, do nothing (don't change this row's position value)
    //println("\(personAtCurrentIndexIteration.name)'s position was unchnaged")
} else if((sourceIndexPath.row > indexPathForCurrentIteration.row) && (destinationIndexPath.row < indexPathForCurrentIteration.row)) {
    //if the moved row was ahead of this row before BUT behind it after the move, then this row's position value needs to be bumped up one number
    personAtCurrentIndexIteration.position = indexPathForCurrentIteration.row+1
//Etc...

预先感谢您可以提供的任何帮助。


  1. 添加到 CoreData“orderPosition”类型 Int 属性并将 orderPosition 添加到模型文件中。

  2. 当您向 CoreData 添加一些数据时,还添加 orderPosition 值

      let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
      let contxt: NSManagedObjectContext = appDel.managedObjectContext!
      let en = NSEntityDescription.entityForName("MyCoreData", inManagedObjectContext: contxt)
      let freq = NSFetchRequest(entityName: "MyCoreData")
      var MyData = contxt.executeFetchRequest(freq, error: nil)!
      var newItem = Model(entity: en!, insertIntoManagedObjectContext: contxt)
      var newOrderPosition = MyData.count
    
    
      //here you add some data to your CoreData
      //and also you must add new order position
      newItem.orderPosition = orderPosition
    
  3. 在 TableView 中,您必须创建一个函数来对将在 TableView 中显示的数组进行排序。像这样的东西:

        func RefreshCoredata()
    {
        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        let freq = NSFetchRequest(entityName: "MyCoreData")
        let contxt: NSManagedObjectContext = appDel.managedObjectContext!
    
        let sortDescriptor = NSSortDescriptor(key: "orderPosition", ascending: true)
        freq.sortDescriptors = [sortDescriptor]
        MyData = contxt.executeFetchRequest(freq, error: nil)!
    
    } 
    
  4. 请记住,在将他发送到桌子之前,您必须始终对数组进行排序!

  5. 当您想要重新排序表行时必须做什么? :

    override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
     }
    
    override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) {
    
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let contxt: NSManagedObjectContext = appDel.managedObjectContext!
    
    RefreshCoredata()
    
    
    if fromIndexPath.row > toIndexPath.row
    {
        for i in toIndexPath.row..<fromIndexPath.row
    
        {
            MyData[i].setValue(i+1, forKey: "orderPosition")
    
    
        }
    
        MyData[fromIndexPath.row].setValue(toIndexPath.row, forKey: "orderPosition")
    }
    if fromIndexPath.row < toIndexPath.row
    {
    
        for i in fromIndexPath.row + 1...toIndexPath.row
    
        {
            MyData[i].setValue(i-1, forKey: "orderPosition")
    
    
        }
    
        MyData[fromIndexPath.row].setValue(toIndexPath.row, forKey: "orderPosition")
    
    
    
    }
    
    contxt.save(nil)
    
    RefreshCoredata()
    
    }
    

这需要重置 CoreData 中的排序位置

  1. 当你想删除一些表行时你必须做什么?

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle:
    UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath)
    {
    if editingStyle == .Delete {
    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let contxt: NSManagedObjectContext = appDel.managedObjectContext!
    RefreshCoredata()
    contxt.deleteObject(MyData[indexPath.row] as NSManagedObject)
    for i in indexPath.row + 1..<MyData.count
            {
                MyData[i].setValue(i-1, forKey: "orderPosition")
            }
    RefreshCoredata()
    
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
     contxt.save(nil)
    
     }
    

就这样!

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

使用 tableView:moveRowAtIndexPath:toIndexPath: 方法后将新订单保存到核心数据 的相关文章

  • ios 8 核心数据崩溃

    保存时 CoreData 发生崩溃 2014 09 16 09 51 58 273 My app 2678 105246 Terminating app due to uncaught exception NSInvalidArgument
  • 在 Swift 3 中单击和双击 UITableViewCell

    我在 TableView Cell 上有故事板 segue 我用它来在单元格单击中传输到另一个 VCdidSelectRowAt方法 现在我双击了TapGestureRecognizer处理手机上的点击问题 问题是 单击时 segue 正在
  • 带有地图的 JavaFX TableView 对象

    因此 我对 JavaFx TableView 进行了一些挖掘 并找到了一些针对简单情况的不错的解决方案 This article http docs oracle com javafx 2 ui controls table view ht
  • 在 iOS 中录制音频并永久保存

    我制作了 2 个 iPhone 应用程序 可以录制音频并将其保存到文件中并再次播放 其中之一使用 AVAudiorecorder 和 AVAudioplayer 第二个是苹果的在这里说话 http developer apple com l
  • swift 中的负数模

    负数模如何在 swift 中工作 当我执行 1 3 时 它给出 1 但余数是 2 其中有什么问题 雨燕余数运算符 计算余数 整数除法 a b a a b b where 是截断整数除法 在你的情况下 1 3 1 1 3 3 1 0 3 1
  • 维护 UISegmentedControl 中的选择

    我可以保持 UISegmentViewControl 段的选定状态吗 即 即使用户选择了另一个段 也可以保持一个段显示为选中状态 我似乎在任何地方都找不到任何可以做到这一点的东西 这是不可能开箱即用的 看如何才能选择 UISegmented
  • Parse - 使用 Swift 进行子类化?

    我正在尝试让标准子类与 swift 一起使用 桥接标头 h import
  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • UICollectionView 列的垂直偏移

    右图是我试图实现的目标 Does anyone know how I could achieve this on a two column UICollectionView I m able to discern my columns by
  • Apple 帮助创作

    我正在跟进本指南 http developer apple com library mac documentation Carbon Conceptual ProvidingUserAssitAppleHelp authoring help
  • 在 viewWillAppear( ) 中获取空值,但在 viewDidLoad( ) 中获取有效值

    When print mess 被称为来自viewDidLoad函数 它打印预期的内容 但是当从viewWillAppear函数 它给出空输出 完成分配后标签也没有更新viewDidLoad 为什么是这样 主视图控制器 if segue i
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • iPhone ImageView序列动画

    嘿 尝试将一个简单的 png 序列动画放入我的应用程序中 我在 IB 中放置了第一个框架 并将图形动画出口连接到它 序列中有 54 个 png 名称为 Comp 1 0000 png 到 Comp 1 00053 png 这是我的代码 vo
  • 如何在 SwiftUI 中呈现视图而不将其嵌入到当前导航流中?

    我已经完成了日志记录入门 并且需要呈现一个 HomeView 它对之前的导航流程一无所知 var body some View if viewModel isValidated destination else LoadingView 通过
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • 实时获取 Apple Watch heartRateVariabilitySDNN 吗?

    我正在使用下面的函数来获取 heartRateVariabilitySDNN 但它只获取一次并且不能像 heartbeat 那样实时计算 func HRVstart guard let quantityType HKObjectType q
  • 如何将代码 AVFoundation Objective C 转换为 Swift?

    我正在 swift 中使用 AVFoundation 来拍照 但我无法将任何 func 代码行从 Objective C 转换为 Swift 我的功能代码是 void capImage method to capture image fro
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • iOS 上的本地通知需要用户许可吗?

    我在我的应用程序中使用 UILocalNotification 来安排通知 通知工作正常 并在我需要时显示 我对此没有意见 我没有做任何远程 推送通知 让我想知道的是 我从未见过您通常在多个应用程序中看到的推送通知的著名权限对话框 我什至重
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d

随机推荐

  • 在使用 Python 的 matplotlib 制作动画期间,第一组(散点)绘图数据保留在图表上

    我正在尝试为图表上的一条线和 3 个散点制作动画 除了图表上的第一组散点没有被删除之外 一切似乎都正常 这是代码 您可以尝试将 n 设置为 1 2 或 3 import numpy as np from math import from p
  • 当前可用的最好的 Ajax 历史记录和书签插件 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 似乎每个 Ajax 历史记
  • 如何为 Apache-CXF JAX-WS 启用 Spring Security

    如何在 Apache CXF 上为 apache JAX WS 启用 Spring Security 网络上的示例包括 Jax RS 示例 但我不使用 Jax RS 我不想使用 cxf 的安全性 如何在我的代码中实现它 两种可能的方式 Pu
  • gitignore 没有扩展名的二进制文件

    如何在中忽略二进制文件git使用 gitignore file 例子 g hello c o hello hello 文件是一个二进制文件 能git忽略这个文件 Ignore all Unignore all with extensions
  • Excel VBA 强制关闭 IE

    我目前正在使用以下子程序在自动化后关闭我的 IE Public Sub CloseIE Dim Shell As Object Dim IE As Object Set Shell CreateObject Shell Applicatio
  • 运算符重载中的类数据封装(私有数据)

    下面是代码 代码 访问说明符适用于类级别 而不是实例级别 因此Rational类可以查看任何其他类的私有数据成员Rational实例 自从你的Rational operator 是一个成员函数 它可以访问它的私有数据Rational争论 注
  • jquery动态绑定.on()选择父母还是孩子?

    例如 dataTable tbody tr on click function alert this text dataTable tbody on click tr function alert this text on 将 tr 与单击
  • opengl:将原点更改为左上角

    我在将 openGL 原点设置为视图的左上角时遇到问题 因此 在我的窗口调整大小处理程序中 我执行以下操作 ox and oy are some offsets and width and height are the required v
  • 有没有更好的方法来找出本地 git 分支是否存在?

    我正在使用以下命令来查明是否localgit 分支与branch name存在于我的存储库中 它是否正确 有没有更好的办法 请注意 我是在脚本内执行此操作 为此我想使用管道命令如果可能的话 git show ref verify quiet
  • Itextsharp:在一页上调整 2 个元素

    所以 我在使用 C NET 4 0 WinForms 和 iTextSharp 5 1 2 时遇到了这个问题 我在数据库中存储了一些扫描图像 需要使用这些图像即时构建 PDF 有些文件只有一页 而其他文件则有数百页 使用以下方法工作得很好
  • 错误:VB 运行时未加载

    根据社区的建议编辑版本 In a Windows 8 1电话项目 一部分VB Net还带有商店应用程序和可移植类库的解决方案 我收到此错误消息 由于未加载 VB 运行时 无法调用 但据我所知 尽管如此 代码仍在运行 直到 最终弹出一个错误
  • ForEach 方法后 PowerShell 长度的奇怪行为

    In 官方文件据说Length是一个别名Count 但是我发现他们的行为有所不同的一种情况 另外 如果我更换ForEach方法与ForEach Object the Length会发出 3 谁能解释一下吗 gt 1 3 ForEach Le
  • 使用 SBJSON 解析 Objective-C 中的 JSON

    我只想使用 SBJSON 框架在 Objective C 中解析这个 JSON 字符串 并检索三个数据单元 x 197 y 191 text this is a string 如何才能做到这一点 NSString jsonString x
  • 加快镜头的实时绘图 (cv2)

    我正在尝试使用 cv2 模块为视频的每一帧创建实时散点图 下面的代码正是这样做的 然而 对于包含超过 60000 个帧的超过 8 分钟的镜头需要处理 代码效率不高 并且需要比获得所需输出所需的时间更长的时间 vidcap cv2 Video
  • Rails 中命名范围的意义是什么?

    在了解详细信息之前 问题1 这里的范围是什么意思 即名为 范围 使用命名范围有什么好处 Now 摘自 Rails 敏捷开发 一书 class Order lt ActiveRecord Base named scope last n day
  • 检查 Cloud Firestore 中文档字段的特定值

    我想使用自定义用户名创建用户注册 我将用户的用户名存储在 Firestore 中的用户文档中 如何验证我的用户集合中已存在的用户名 也许有人已经有了用于反应式表单验证的片段 没有有效的方法来检查集合中所有文档的特定值 您必须依次阅读每个文档
  • 如何为同一 pandas Dataframe 中的所有不同列制作单独的 Seaborn kde 图?

    如何为 pandas 数据框的所有列制作两个单独的 Seaborn kde 图 一个熊猫数据框 df 有六列 例如下面 df columns A B C D E F 我尝试了以下代码 但没有成功 下面的代码有什么提示吗 df sns loa
  • 正则表达式 \b 但在 C# 中不仅仅包含字母数字字符

    我想要相同的功能 b但与其他角色 在 C 中 我想要类似的东西 string str b Regex Escape string b 不过我有一些所以Regex Escape Something 会在字符串中找到它Typing Someth
  • 逻辑 CPU 计数返回 16 而不是 4

    我有一个 Intel Core i5 2450m 2 个物理处理器和 4 个逻辑处理器 我想找到一种方法来计算 AMD 和 Intel CPU 上的逻辑和物理核心 但是 经过一番搜索 我发现了一些奇怪的事情 我的代码没有返回 4 个逻辑单元
  • 使用 tableView:moveRowAtIndexPath:toIndexPath: 方法后将新订单保存到核心数据

    我在 Swift iOS 应用程序中有一个 tableView 允许用户对行重新排序 点击 编辑 按钮 可以重新排序或删除行 然后重新点击 编辑 按钮 现在显示为 完成 以完成该过程 如果我只是使用 tableView moveRowAtI