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

.onDelete在排序的ForEach - SwiftUI中不起作用

在SwiftUI中,.onDelete修饰符用于处理列表中的删除操作。如果你发现在排序后的ForEach中使用.onDelete不起作用,可能是由于以下几个原因:

基础概念

  • @State: 用于声明一个状态变量,当状态改变时,视图会重新渲染。
  • ForEach: 用于遍历集合,并为集合中的每个元素生成视图。
  • .onDelete: SwiftUI中的一个修饰符,用于处理列表项的删除操作。

可能的原因

  1. 数据源不是Identifiable: .onDelete要求数据源中的元素必须是Identifiable的,即每个元素都有一个唯一的标识符。
  2. 数据源未正确更新: 删除操作后,数据源没有正确更新,导致视图没有刷新。
  3. 排序操作影响了删除: 如果在删除前进行了排序,可能会影响到删除操作的正确性。

解决方案

以下是一个示例代码,展示了如何在排序后的ForEach中正确使用.onDelete

代码语言:txt
复制
import SwiftUI

struct ContentView: View {
    @State private var items = [
        Item(name: "Item A", id: UUID()),
        Item(name: "Item B", id: UUID()),
        Item(name: "Item C", id: UUID())
    ]
    
    var body: some View {
        NavigationView {
            List {
                ForEach(items.sorted(by: {$0.name < $1.name}), id: \.id) { item in
                    Text(item.name)
                }
                .onDelete(perform: deleteItems)
            }
            .navigationTitle("Sortable List")
        }
    }
    
    private func deleteItems(at offsets: IndexSet) {
        items.remove(atOffsets: offsets)
    }
}

struct Item: Identifiable {
    let name: String
    let id: UUID
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

关键点解释

  1. 数据模型: Item结构体实现了Identifiable协议,确保每个元素都有一个唯一的id
  2. 排序: 使用sorted(by:)方法对items进行排序。
  3. 删除操作: 在.onDelete中调用deleteItems(at:)方法,该方法会从items数组中移除指定索引的元素。

应用场景

这种模式适用于需要展示一个可排序且支持删除操作的列表,例如待办事项列表、购物车等。

通过上述方法,你应该能够在排序后的ForEach中正确实现.onDelete功能。如果仍然遇到问题,请检查数据源是否正确更新,并确保每个元素都是Identifiable的。

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

相关·内容

在 SwiftUI 中的作用域动画

前言从一开始,动画就是 SwiftUI 最强大的功能之一。你可以在 SwiftUI 中快速构建流畅的动画。...简单示例让我们从一个简单的示例开始,展示我们旧方法的一些缺点,这些方法用于在 SwiftUI 中驱动动画。...0 : 20.0) } } }}正如你所看到的,SwiftUI 提供了一种类似的方法,以在视图层次结构中维护有作用域的事务。...总结这篇文章介绍了在SwiftUI中构建动画的新方法,重点解决了在多步动画或特定视图层次结构中控制动画的挑战。...最后,介绍了在 SwiftUI 中构建有作用域的事务的新方法,以维护更具精确性和可控性的动画。这些新功能在最新的平台上可用,为SwiftUI开发者提供了更强大的动画工具。

17610
  • 在 SwiftUI 中实现视图居中的若干种方法

    欢迎大家在 Discord 频道[2] 中进行更多地交流将某个视图在父视图中居中显示是一个常见的需求,即使对于 SwiftUI 的初学者来说这也并非难事。...在 SwiftUI 中,有很多手段可以达成此目的。本文将介绍其中的一些方法,并对每种方法背后的实现原理、适用场景以及注意事项做以说明。...当然,你也可以利用 Spacer 这个特性,控制 Text 在 HStack 中可使用的宽度。...().fill(.clear)在使用 SwiftUI 进行开发的过程中,Color、Rectangle 等经常被用来实现对容器的等分操作。...我为本文这种通过多种方法来解决一个问题的方式添加了【小题大作】标签,目前使用该便签的文章还有:在 Core Data 中查询和使用 count 的若干方法[6]、在 SwiftUI 视图中打开 URL

    6.8K40

    在 SwiftUI 中 accessibilityChildren 视图修饰符的作用

    前言SwiftUI 为我们提供了一系列丰富的视图修饰符,用于操作视图的可访问性树。我已经介绍了其中许多,你可以在博客中找到它们。...SwiftUI 不会渲染我们通过 ViewBuilder 闭包传递的视图,它仅用于填充可访问性树的子元素。...完整代码首先,你需要定义 DataPoint 结构体,然后可以在 ContentView 中初始化 dataPoints 数组。...在上述代码中,将柱状图填充颜色设为红色。您可以根据需要自行更改填充颜色。运行截图:总结今天,我们了解了 SwiftUI 为我们提供的又一个强大的可访问性视图修饰符。...SwiftUI 凭借提供如此多友好的 API,简化了我们为了使我们的应用对每个人都具有可访问性而必须做的工作,做得非常出色。

    12120

    优化在 SwiftUI List 中显示大数据集的响应效率

    标识( Identity )是 SwiftUI 在程序的多次更新中识别相同或不同元素的手段,是 SwiftUI 理解你 app 的关键。...在 SwiftUI 中为视图设置显式标识目前有两种方式: 在 ForEach 的构造方法中指定 由于 ForEach 中的视图数量是动态的且是在运行时生成的,因此需要在 ForEach 的构造方法中指定可用来标识子视图的...在我们的当前的例子中,通过将 Item 声明为符合 Identifiable 协议,从而实现了在 ForEach 中进行了默认指定。...使用了 id 修饰符相当于将这些视图从 ForEach 中拆分出来,因此丧失了优化条件。 总之,当前在数据量较大的情况下,应避免在 List 中对 ForEach 的子视图使用 id 修饰符。...生产中的处理方式 本文为了演示 id 修饰符在 ForEach 中的异常状况以及问题排查思路,创建了一个在生产环境中几乎不可能使用的范例。

    9.3K20

    在 SwiftUI 中创建自适应的程序化导航方案

    因此在 SwiftUI 中,掌握两种导航容器的状态表述差异是实现自适应导航方案的关键。...在栈中推送和弹出数据的过程对应了导航容器中添加和移除视图的操作。弹出全部数据相当于返回根视图,推送多个数据相当于一次性添加多个视图并直接跳转到最后数据所代表的视图。...需要特别注意的是,在 NavigationStack 中,根视图是直接通过代码声明的,并不存在于“栈”中。...例如:在 A 中修改状态 b,B 响应 b 状态;在 B 中修改状态 c,C 视图响应状态 c。...不要忘记 NavigationStack 的根视图不在它的“栈”数据中在本例中,转换至 NavigationStack 时,需要将 Detail 列中声明的视图添加到“栈”的底端。反过来则将其移除。

    4.3K30

    排序算法在JDK中的应用(二)快速排序

    作者|杨旭 来源|https://blog.csdn.net/Alex_NINE 改进后的快速排序 在分析上述代码时,可以发现程序会在特殊的情况调用sort()方法即改进后得快速排序,接下来就来分析sort...called pair insertion 在快速排序的上下文中(即满足进入sort()方法的数组)他比传统的 * sort, which is faster (...Therefore in float and 因此在单双精度的排序算法中我们必须使用更加精确的赋值即a[less]=a[great] * double...e2和e4) 否则使用只有一个枢轴值(e3)进行排序,但是这里还是把待排序数组分成了三个部分分别是大于,等于和小于枢轴的区域 结语 写了好久终于把这篇博客写好了,过程中查了好多的资料看了好多的博客,不过最后还是把这个坑填上了...多学习 多阅读 多思考 PS 排序算法写得差不了,接下来准备把数据结构的内容用Java语言全部写一遍。争取在9月份之前完成这个目标。

    1.1K30

    架构之路 (五) —— VIPER架构模式(一)

    开始 首先看下主要内容: 在本教程中,您将了解如何在SwiftUI和Combine中使用VIPER体系结构模式,同时构建一个允许用户创建公路旅行的iOS应用程序,来自翻译。...在Data Sources组中,有用于保存或加载数据的辅助函数。 如果您喜欢在WaypointModule组中查看前面的内容。它有一个Waypoint编辑屏幕的VIPER实现。...路由器Router处理屏幕之间的导航。这与SwiftUI不同,在SwiftUI中,视图显示任何新视图。...最后,在TripListView中,在ForEach的结束括号后面添加以下内容: .onDelete(perform: presenter.deleteTrip) 将. ondelete添加到SwiftUI...当您将其放置在NavigationView中时,该链接将成为一个按钮,将destination推送到导航堆栈上。 content块可以是任何一个SwiftUI视图。

    17.6K10

    SwiftUI 与 Core Data —— 安全地响应数据

    SwiftUI 与 Core Data —— 问题[1]SwiftUI 与 Core Data —— 数据定义[2]SwiftUI 与 Core Data —— 数据获取[3]可以在 此处[4] 获取演示项目...当开发者在模型编辑器中为属性设置了默认值( 取消可选 ),在 Xcode 自动生成的托管对象类定义代码中仍会将不少类型声明为可选值类型。通过手动修改类型( 将 String?...回到 Xcode 创建的 Core Data 模版代码,我们做如下的尝试,在进入 NavigationLink 后一秒钟删除该数据:ForEach(items) { item in NavigationLink..., formatter: itemFormatter)")因此在 ContentView 的 ForEach 中,item 并不会被视为一个可以引发视图更新的 Source of truth ( 通过....now, formatter: itemFormatter)")如果使用我们在 SwiftUI 与 Core Data —— 数据定义[7] 一文中讨论的 ConvertibleValueObservableObject

    3.3K20

    SwiftUI 与 Core Data —— 数据获取

    遗憾的时,NSFetchedResultsController 为 UITableView 准备的基于 NSFetchRequestResultType 优化操作在 SwiftUI 中并不起作用。...在 SwiftUI 中,ForEach 会根据数据标识( Identifier )自动处理视图的添加、删除等操作,因此,当在 SwiftUI 中使用 NSFetchedResultsController...不可在 update 方法中同步地改变引发视图更新的数据与 SwiftUI 在视图中更新 Source of truth 的逻辑一致,在一个视图更新周期中,不能对 Source of truth 再度更新...这样可以减少 ForEach 数据集的变化频次,改善 SwiftUI 的视图效率。...Core Data 本身并不具备直接从 SQLite 中获取分组记录的能力,目前的实现方式是以 sectionIdentifier 为首要排序条件获取所有的数据。

    4.7K30

    在MATLAB中实现高效的排序与查找算法

    在MATLAB中实现高效的排序与查找算法 在MATLAB中,排序与查找是常见且重要的算法任务。在处理大量数据时,算法的效率直接影响程序的运行速度和性能。...在MATLAB中,内置的sort函数通常会选择最快的排序算法,因此在实际应用中,除非有特殊的性能需求,否则可以直接使用MATLAB的内置排序功能。...在MATLAB中,可以通过原地归并排序来减少空间开销,但实现起来较为复杂。通过改变递归过程的实现方式,可以减少不必要的内存分配。...4.4 高效的查找策略 在实际应用中,查找操作是常见的性能瓶颈之一,尤其是在需要频繁查找或数据量非常大的情况下。...MapReduce等分布式计算框架已经在实际应用中得到广泛使用。 自适应排序算法:一些新型的排序算法将能够根据数据的特性动态选择排序策略。

    27910

    自定义排序算法在JavaScript中的应用

    前言在处理数据时,我们常常需要对数组进行排序以满足特定的展示或分析需求。虽然JavaScript提供了内置的sort()方法来简化这一过程,但在面对复杂排序逻辑时,自定义排序函数则显得尤为重要。...我们的目标是根据这些字符串的特定部分,按照一定的规则(例如先按点前的部分,再按点后的数字部分排序)来对数组进行排序。...日期格式字符串排序:针对特定的日期格式,优先比较年份、月份、日期等部分。多关键字排序:设计更复杂的比较逻辑,支持基于多个关键字的排序规则。...结论通过自定义排序函数,我们能够精确控制数组元素的排序逻辑,从而满足各种复杂的应用场景。理解并掌握这类算法不仅能够提升我们的编程能力,还能在实际开发中解决更多实际问题。...希望本文的讲解和示例能够激发你对自定义排序函数的兴趣,并在你的项目中发挥重要作用。

    12210

    干货 | XGBoost在携程搜索排序中的应用

    一、前言 在互联网高速发展的今天,越来越复杂的特征被应用到搜索中,对于检索模型的排序,基本的业务规则排序或者人工调参的方式已经不能满足需求了,此时由于大数据的加持,机器学习、深度学习成为了一项可以选择的方式...说起机器学习和深度学习,是个很大的话题,今天我们只来一起聊聊传统机器学习中XGBoost在大搜中的排序实践。 二、XGBoost探索与实践 聊起搜索排序,那肯定离不开L2R。...3.1 前期数据准备 首先,我们需要进行需求分析,就是在什么场景下排序。...假设我们需要针对搜索召回的POI场景进行排序,那么需要确定几件事情: 数据来源:搜索的数据就是各种POI,然后需要确定我们有哪些数据可以用来排序,比如最近半年的搜索POI的曝光点击数据等; 特征梳理:需要梳理影响...四、模型工程实践 4.1 评估指标制定 在搜索业务中,考虑的有以下两种情况: 看重用户搜索的成功率,即有没有点击; 看重页面第一屏的曝光点击率; 在文章开头提到的L2R的三种分类中,我们在XGBoost

    1.8K12
    领券