У меня есть массив записей транзакций, отсортированных по дате. Добавление и просмотр записей работает нормально, но при удалении записи удаляется не та запись. (Сообщения об ошибках не генерируются.) Наблюдая за кодом с точками останова и пошаговым выполнением, я заметил, что смещение входа, используемое отсортированным массивом, передается в 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
OnDelete Удаление неправильной записи ⇐ IOS
Программируем под IOS
1730657647
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)
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79153355/ondelete-removing-wrong-entry[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия