ForEach onDelete Mac
Posted
技术标签:
【中文标题】ForEach onDelete Mac【英文标题】: 【发布时间】:2020-02-27 13:36:49 【问题描述】:我想弄清楚如何从 Mac 的 swiftui 中的数组中删除。我能找到的所有文章都展示了如何以 UIKit 方式将 .ondelete 方法添加到 foreach 中。这不适用于 Mac,因为我没有像 ios 那样的红色删除按钮。那么如何在 Mac 上的 ForEach 中从数组中删除项目。 这是我尝试过的代码,它给了我错误
Fatal error: Index out of range: file
import SwiftUI
struct ContentView: View
@State var splitItems:[SplitItem] = [
SplitItem(id: 0, name: "Item#1"),
SplitItem(id: 1, name: "Item#2")
]
var body: some View
VStack
Text("Value: \(self.splitItems[0].name)")
ForEach(self.splitItems.indices, id:\.self) index in
HStack
TextField("Item# ", text: self.$splitItems[index].name)
Button(action: self.removeItem(index: index)) Text("-")
.frame(maxWidth: .infinity, maxHeight: .infinity)
func removeItem(index:Int)
self.splitItems.remove(at: index)
struct SplitItem:Identifiable
var id:Int
var name:String
【问题讨论】:
这能回答你的问题***.com/a/60319531/1040347 吗? 如果我错过了该链接中的解决方案,我深表歉意。但我不认为它只有助于我看到的差异是使用点击手势。我希望它在 Mac 上单击按钮时删除。没有 iOS 样式列表删除选项。 我的链接没有多大帮助。 【参考方案1】:您的ForEach
代码部分完全正确。
可能的错误源可能是该行
Text("Value: \(self.splitItems[0].name)")
- 删除所有项目后肯定会崩溃。
下一个假设是VStack
。绘制视图层次结构后,将不允许更改它。
如果您将 VStack 替换为 Group 并且下一个代码将起作用:
var body: some View
Group
if !self.splitItems.isEmpty
Text("Value: \(self.splitItems[0].name)")
else
Text("List is empty")
ForEach(self.splitItems.indices, id:\.self) index in
HStack
TextField("Item# ", text: self.$splitItems[index].name)
Button(action: self.removeItem(index: index)) Text("-")
.frame(maxWidth: .infinity, maxHeight: .infinity)
【讨论】:
文本字段只是用来测试编辑文本字段是否有效。这不是必需的,所以我删除了该行并将 vstack 更改为您建议的组。它没有用,但至少我得到了一个新的错误,哈哈。ForEach(_:content:)
应该只用于 constant 数据。而是将数据符合 Identifiable
或使用 ForEach(_:id:content:)
并提供明确的 id
!
从这篇文章medium.com/swlh/…在reddit上找到了答案@
不错。我在发布之前测试了我的代码 - 它有效。您的模型已经确认到Identifiable
。没有它 forEach 将无法工作(在当前示例中)。你得到了什么错误?还有更多细节吗?【参考方案2】:
所以我能够在这个article 中找到答案,
而不是通过从for循环传递索引来调用array.remove(at),而是使用array.FirstIndex(where)调用它。
【讨论】:
老实说,很奇怪。 是的。我认为这与在调用此删除方法之前可以更改(即删除/添加等)在 foreach 中生成的索引有关。不过还是很奇怪,因为当我使用 firstIndex(where:) 时,我通过索引引用它。以上是关于ForEach onDelete Mac的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI .onDelete 从 ForEach 获取 var
Swiftui foreach 索引超出范围 ondelete 问题
SwiftUI ForEach.onDelete 在 TabView 中无法正常工作
。onDelete在排序的ForEach中不起作用-SwiftUI