簡體   English   中英

ForEach onDelete Mac

[英]ForEach onDelete Mac

我想弄清楚如何從 swiftui for Mac 中的數組中刪除。 我能找到的所有文章都展示了如何使用 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
}

您的ForEach代碼部分是完全正確的。 可能的錯誤來源可能是行Text("Value: \\(self.splitItems[0].name)") - 刪除所有項目后,這肯定會崩潰。

下一個假設是VStack 繪制視圖層次結構后,將不允許更改它。 如果您用Group替換 VStack 並且下一個代碼將起作用:

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)
}

所以我能夠在這篇文章中找到答案,

而不是通過傳遞來自 for 循環的索引來調用 array.remove(at) 使用 array.FirstIndex(where) 調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM