SwiftUI - ForEach 删除转换始终仅应用于最后一项

2023-12-10

我正在尝试向我的动画添加删除动画ForEach,使得每个Card当移除时,其内部会扩展。这是我到目前为止所拥有的:

问题是无论哪一个Card被按下,它是总是最后一个动画。有时,每张卡片内的文本都有奇怪的滑动/变形动画。这是我的代码:

/// Ran into this problem: "SwiftUI ForEach index out of range error when removing row"
/// `ObservableObject` solution from https://stackoverflow.com/a/62796050/14351818
class Card: ObservableObject, Identifiable {
    let id = UUID()
    @Published var name: String

    init(name: String) {
        self.name = name
    }
}

struct ContentView: View {
    @State var cards = [
        Card(name: "Apple"),
        Card(name: "Banana "),
        Card(name: "Coupon"),
        Card(name: "Dog"),
        Card(name: "Eat")
    ]
    
    var body: some View {
        ScrollView(.horizontal) {
            HStack {
                
                ForEach(cards.indices, id: \.self) { index in
                    CardView(card: cards[index], removePressed: {
                        
                        withAnimation(.easeOut) {
                            _ = cards.remove(at: index) /// remove the card
                        }
                        
                    })
                    .transition(.scale)
                }
                
            }
        }
    }
}

struct CardView: View {
    
    @ObservedObject var card: Card
    var removePressed: (() -> Void)?
    
    var body: some View {
        Button(action: {
            removePressed?() /// call the remove closure
        }) {
            VStack {
                Text("Remove")
                Text(card.name)
            }
        }
        .foregroundColor(Color.white)
        .font(.system(size: 24, weight: .medium))
        .padding(40)
        .background(Color.red)
    }
}

我怎样才能横向扩展Card单击的是,而不是最后一个?


您看到此行为的原因是因为您使用索引作为id for ForEach。因此,当一个元素从cards数组,唯一的区别是ForEach看到的是最后一个索引消失了。

您需要确保id唯一标识每个元素ForEach.

如果必须使用索引并标识每个元素,则可以使用enumerated方法或zip数组及其索引在一起。我喜欢后者:

ForEach(Array(zip(cards.indices, cards)), id: \.1) { (index, card) in 
   //...
}

上面使用对象本身作为ID,这需要符合Hashable。如果你不想这样,你可以使用id直接属性:

ForEach(Array(zip(cards.indices, cards)), id: \.1.id) { (index, card) in
  //...
}

为了完整起见,这里是enumerated版本(从技术上讲,它不是索引,而是偏移量,但对于基于 0 的数组来说是相同的):

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

SwiftUI - ForEach 删除转换始终仅应用于最后一项 的相关文章

  • Swift 中的柯里函数

    我想创建一个返回柯里函数的函数 如下所示 func addTwoNumbers a Int b Int gt Int return a b addTwoNumbers 4 b 6 Result 10 var add4 addTwoNumbe
  • 可以获取位置,但无法获取航向

    我目前只使用模拟器 但我在 iOS 模拟器上快速使用 CoreLocation 时遇到问题 我得到此代码打印的位置更新 但从未得到标题 我不想当然 我正在尝试制作一个指南针类型的应用程序 它将显示目标的方位 class CompassVie
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 如何将字符串日期转换为 NSDate?

    我想转换字符串 2014 07 15 06 55 14 198000 00 00 to an NSDate在斯威夫特 尝试这个 let dateFormatter NSDateFormatter dateFormatter dateForm
  • 我的游戏中应该有多少个视图控制器?

    我开始使用 spritekit 构建我的第一个游戏 现在我只有一个视图控制器来呈现开始屏幕场景 override func viewDidLoad super viewDidLoad let scene StartScreenScene C
  • 为什么我的视图仍然以横向呈现?

    我的视图是由导航控制器控制的 因此我将导航控制器支持的方向设置为明确的纵向和纵向UpSideDown 这可以工作 但是如果调用视图时前一个视图处于横向状态 它将以横向方式呈现并保持横向状态 直到设备旋转 如何防止这种情况发生 这是我的代码
  • SKNode 上的 runAction 未完成

    我使用 NSOperation 子类来获取串行执行SKAction正如这个问题中所描述的 如何在 Swift 中子类化 NSOperation 以将 SKAction 对象排队以进行串行执行 https stackoverflow com
  • Swift C 回调 - Swift 类指针的 takeUnretainedValue 或 takeRetainedValue

    我有一些UIView or UITableViewCell 里面我有 C 回调 例如 CCallback bridge self observer data gt Void in let mySelf Unmanaged
  • 在视图控制器之间传递数据使用从嵌入导航控制器的视图到 tabbarcontroller 的 Segue

    我有两个视图 我想将数据从一个视图传递到下一个视图 第一个视图是我想要传递给下一个视图的数据的地方 我们称之为SourceViewController 然而SourceViewController嵌入在一个NavigationViewCon
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • 无法将“SDWebImageActivityIndi​​cator”类型的值分配给“ST_SDWebImageIndicator”类型?

    I have multiple flavours targets in my Xcode project I am also using SDWebImage in my app Everything was working fine un
  • NSDateFormatter 返回错误的日期 + Swift

    Code let dateString 2016 04 02 var formatter NSDateFormatter NSDateFormatter formatter timeZone NSTimeZone abbreviation
  • Swift - 选择值后隐藏 pickerView

    我发现了类似的问题 他们的答案很有帮助 但我坚持最后一件事 我试图在点击字段时显示 pickerView 然后选择数据时 我希望 pickerView 隐藏 我可以从 pickerView 获取数据来隐藏 但是 pickerView 后面仍
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • 将 Xcode 的测试类助理编辑器与 Swift 类结合使用

    在 Xcode 中工作时 在助理编辑器中提取单元测试用例通常会很好 目前 我一直在手动选择测试文件 但我看到助理编辑器有一个选项Test Classes 我试图让这个选项自动提取我的测试文件 但我似乎无法让它工作 是否需要某种配置 它不适用
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • xcode 6.1 (Swift) 中的 SIGABRT 运行时错误

    与最初的代码相比 唯一的更改是在ViewControl swift override func viewDidLoad newMessage hidden true super viewDidLoad Do any additional s
  • Swift 中通过不同类调用委托方法

    我正在获取 JSON 菜单 一旦 JSON 返回 我想运行 menuReady 来更新表的内容在 SomeTableViewController 类中 但下面的代码似乎不起作用 AIM Run 菜单就绪 JSON 返回后更新内容 PROBL
  • 在 UIMenuItem 上设置accessibilityLabel

    我正在尝试设置accessibilityLabel of a UIMenuItem而且似乎没有效果 无论如何 VoiceOver 只是读取项目的标题 let foo UIMenuItem title foo action selector

随机推荐

  • 将数据添加到列的简单方法

    我想将两个单独的数据集插入到 JavaFX TableView 中的列中 基本上我有 2 个带有字符串的 LinkedList 我想将一个列表放在一列中 另一个列表放在第二列中 做到这一点最简单的方法是什么 或者另一个 JavaFX 元素更
  • 应用程序定义或对象定义错误 1004

    VBA 抛出上面给出的错误Sheets Sheet1 Range A i Copy Destination Sheets Sheet2 Range A i A LastCol 1 我想做的实际上是复制 A i单元格 在第一次迭代中它是A2
  • Firestore 查询中可以使用通配符功能吗?

    我正在尝试决定如何在 firestore 中对数据进行建模 基本上 它是一个列出欢乐时光和餐厅其他特色菜的应用程序 每个餐厅 酒吧可能会根据一周中的某一天提供多种特色菜和欢乐时光 这是我的一个非常简单的例子hoping对数据建模 name
  • Python的平台模块未检测到Windows 10

    我目前正在 Windows 10 上工作 如果平台是 Windows 10 则需要放置一些代码 因此 我检查了 python 文档并阅读了有关平台模块的信息 文档是这样说的 platform win32 ver release versio
  • 按下播放按钮后进行回调 - Youtube 嵌入视频

    按下播放按钮后是否可以执行 JavaScript 操作 我知道我需要使用 Youtube API 中的 onStateChange 函数 但我真的不知道从哪里开始 有什么帮助吗 谢谢 我还在这里发现了一些东西 http apiblog yo
  • 计算中的小数点为 。或者 ,

    如果我使用小数点输入数字 则小数点会根据国家和地区格式而变化 可以作为点 或作为逗号 而且我无法控制应用程序在哪个设备上使用 如果区域格式使用逗号 计算就会出错 放入 5 6 与有时只放入 5 和同一时间放入 56 是相同的 即使我以编程方
  • 如何存储 bash 脚本连续两次运行之间的状态

    我有 bash 脚本 它使用cron每分钟都有工作 我想保存脚本的状态以便在下次运行时重用 保存状态的最佳方法是什么 在本例中是分配了数字的变量 因此 在下一次运行中 该数字可以与之前运行的值进行比较 从文件保存和重新加载变量值的示例 us
  • 从 Rails ActiveRecord 的结果中排除一些 id

    我对某些部分的查询文章有以下声明 Article all joins gt sections conditions gt sections gt id gt 3 4 6 7 8 9 id not in gt some ids limit g
  • 将 javascript 客户端协调到单个后端游戏的最佳方法是什么?

    用于通知 javascript 客户端异步游戏中发生的更改 即其他客户端所做的移动 的最佳方法是什么 作为一个例子 假设一个回合制棋盘游戏 我应该让客户端每隔一秒左右轮询一次 PHP 后端以获取新的动作 还是有更好的方法向同一游戏中的其他客
  • 自定义 Android 通知磁贴的背景

    我注意到我的一个 Android 应用程序为其通知磁贴设置了自定义背景 如下面的屏幕截图所示 该应用程序如何为其通知设置自定义背景 我如何在自己的应用程序中实现同样的目标 NotificationCompat Builder this ch
  • JCO.destination 中未到达合作伙伴错误

    我在 java 程序中建立与 SAP 的连接时遇到问题 我按照 JCO 下载中的示例进行操作 但总是收到此错误 com sap conn jco JCoException 102 RFC ERROR COMMUNICATION Connec
  • Objective C:向 UIButton 调用的方法发送参数

    我有一个在单击 UIButton 时被调用的方法 当我创建按钮时 我希望它存储 NSTimer 作为参数 这是计时器和 UIButton 的创建 我如何添加要发送到方法的计时器 我试过了withObject timer但它给了我一个警告并在
  • 如何编写 KSP 以连接到 KERB_CERTIFICATE_LOGON

    大家好 我编写了一个自定义凭据提供程序 在使用用户名 密码作为凭据时工作正常 密码通过蓝牙传输 毕竟这并不困难 因为文档告诉您要实现哪些接口 现在我想更改凭据以使用证书 我发现我应该为此使用 KERB CERTIFICATE LOGON 结
  • 如何在 swiftUI 的末尾文本字段添加 % 符号

    我想制作一个自定义文本字段 它将显示金额和 符号 谁能告诉我如何实现这一目标 如果我输入 12 它应该自动插入 12 在 UIKit 中 它就像 textField text text struct UiTextFieldRepresent
  • 使用 React Native iOS Release Build 不会加载新代码,但版本会加载

    我的React Native应用程序不响应我在iOS发布模式下对代码的更改 我不知道为什么 但我无法上传包含更改的新版本 但是 当我在代码中应用更改时 版本更改是唯一更改的内容 我能做什么来修复它 无论我是从 XCode 还是使用代码片段构
  • 为seaborn 热图指定特定颜色

    我正在尝试使用 seaborn 制作热图 但无法更改特定值的颜色 假设值 0 应为白色 值 1 应为灰色 然后使用 cmap 提供的调色板 尝试使用面膜 但感到困惑 import matplotlib pyplot as plt impor
  • C# 在面板中绘制圆圈

    我正在做一个关于数学 阿波罗尼乌斯问题 的程序 但首先我的程序需要能够允许用户在面板上绘制三个圆圈 这些圆圈的大小和位置可以不同 我不知道如何允许用户在面板上绘制他们的尺寸圆圈 任何帮助将不胜感激 这是 Windows 窗体的简单演示 us
  • iOS 上的预计电池使用时间[重复]

    这个问题在这里已经有答案了 可能的重复 iPhone 计算电池寿命 我在应用商店中看到许多应用程序提供了不同使用模式 待机 音频和视频播放 Wi Fi 和 3G 浏览器使用 通话时间 的估计电池工作时间 我有类似的要求来计算这样的估计时间
  • C# 读取word文档

    我想阅读服务器中的word文档 doc和docx 服务器没有 安装了office 因此我不能使用com对象 也不能使用商业软件 有没有办法让我单独使用office工具 阅读word docs 2003年和2007年 不幸的是 没有很好的免费
  • SwiftUI - ForEach 删除转换始终仅应用于最后一项

    我正在尝试向我的动画添加删除动画ForEach 使得每个Card当移除时 其内部会扩展 这是我到目前为止所拥有的 问题是无论哪一个Card被按下 它是总是最后一个动画 有时 每张卡片内的文本都有奇怪的滑动 变形动画 这是我的代码 Ran i