OnDelete Удаление неправильной записиIOS

Программируем под IOS
Ответить
Anonymous
 OnDelete Удаление неправильной записи

Сообщение Anonymous »

У меня есть массив записей транзакций, отсортированных по дате. Добавление и просмотр записей работает нормально, но при удалении записи удаляется не та запись. (Сообщения об ошибках не генерируются.) Наблюдая за кодом с точками останова и пошаговым выполнением, я заметил, что смещение входа, используемое отсортированным массивом, передается в onDelete вместо фактически сохраненного смещения массива. В Интернете я нашел пример, похожий на мой, с использованием coreData/swiftData, но не смог найти ничего о том, как передать правильное смещение в onDelete.
Ниже приведен мой код, включая модель. и модель просмотра.
struct ContentView: View {

@Environment(WithdrawalModel.self) private var wdvm

let frmt: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "MMM dd, yyyy"
return formatter
}()

func bankEntries(for date: String) -> [Withdrawal] {
return wdvm.wdArray.filter { frmt.string(from: $0.wdDate) == date }
}

// creates a list of unique dates (no duplicates)
var uniqueDates: [String] {
Array(Set(wdvm.wdArray.map { frmt.string(from: $0.wdDate) }))
.sorted { frmt.date(from: $0) ?? Date() < frmt.date(from: $1) ?? Date() }
.compactMap { $0 }
}

@State private var rates: Double = 0.0

var body: some View {
NavigationStack {
GeometryReader { g in

VStack (alignment: .leading) {

if !wdvm.wdArray.isEmpty {

HStack {
Text("Time/Location")
.padding(.leading, g.size.width * 0.1)

Text("Local/Home")
.padding(.leading, g.size.width * 0.104)
}

List {
// outer ForEach with unique dates
ForEach(uniqueDates, id: \.self) { dateItem in
Section {
// inner ForEach with items of this date
ForEach(bankEntries(for: dateItem)) { item in
RowView(item: item)
}
} header: {
// display date once for all entries with the same date
Text("\(dateItem)")
}
}
.onDelete(perform: deleteItem)
}
} else {
Text("No Withdrawal Entries")
.padding(.top, g.size.height * 0.35)
}
}
.toolbar {
ToolbarItem(placement: .principal) {
Text("ATM Withdrawals")
.foregroundStyle(Color.black)
}

ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink {
AddWithdrawalView()
} label: {
Image(systemName: "plus")
.imageScale(.large)
.symbolRenderingMode(.hierarchical)
}
}
}
.toolbarBackground(Color.orange, for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
.toolbar(.hidden, for: .tabBar)
}

}
}

/*---------------------------------------
may delete withdrawal entries with swipe left
---------------------------------------*/
func deleteItem(at offsets: IndexSet) {

offsets.forEach { singleOffset in
wdvm.wdArray.remove(atOffsets: offsets)

}
}
}

// withdrawal model
struct Withdrawal: Codable, Identifiable {

var id: UUID
var wdDate: Date
var wdCode: String
var wdBank: String
var wdAmtL: Double
var wdAmtH: Double

init(id: UUID = UUID(), wdDate: Date, wdCode: String, wdBank: String, wdAmtL: Double, wdAmtH: Double) {

self.id = id
self.wdDate = wdDate
self.wdCode = wdCode
self.wdBank = wdBank
self.wdAmtL = wdAmtL
self.wdAmtH = wdAmtH
}
}

// Withdrawal ViewModel
@Observable final class WithdrawalModel {

var wdArray: [Withdrawal] {

didSet {

// save withdrawal entries
if let encoded = try? JSONEncoder().encode(wdArray) { // save withdrawal entries
UserDefaults.standard.set(encoded, forKey: StorageKeys.wdBank.rawValue)
}
}
}

init() {

if let wdArray = UserDefaults.standard.data(forKey: StorageKeys.wdBank.rawValue) {
if let decoded = try? JSONDecoder().decode([Withdrawal].self, from: wdArray) {
self.wdArray = decoded
return
}
}

self.wdArray = []
}

/*---------------------------------------
save new withdrawal data
---------------------------------------*/
func addNewWithdrawal(wdDate: Date, wdCode: String, wdBank: String, wdAmtL: Double, wdAmtH: Double) -> () {

let item = Withdrawal(wdDate: wdDate, wdCode: wdCode, wdBank: wdBank, wdAmtL: wdAmtL, wdAmtH: wdAmtH)

wdArray.append(item)

if let encoded = try? JSONEncoder().encode(wdArray) {
UserDefaults.standard.set(encoded, forKey: StorageKeys.wdBank.rawValue)
}
}
}



Подробнее здесь: https://stackoverflow.com/questions/791 ... rong-entry
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»