SwiftUI中如何获取List列表已删除行对应的元素ID
解决SwiftUI List删除时获取元素ID的方案
核心注意点:一定要在修改数组之前先通过offsets索引取出对应元素的ID,数组修改后索引会偏移,就无法拿到正确的被删除元素了
单删除场景(默认List删除逻辑)
常规列表默认只支持单次删除一个元素,直接取offsets的首个索引即可:
func delete(at offsets: IndexSet) { // 先校验索引、获取待删除卡片ID guard let deleteIndex = offsets.first, let targetCardId = stripeManager.paymentMethods[deleteIndex].id else { return } // 调用Stripe删除接口 stripeManager.detachPaymentMethod(paymentMethodId: targetCardId) // 最后再移除数组中对应的元素 stripeManager.paymentMethods.remove(atOffsets: offsets) }
支持多选批量删除场景
如果你的列表允许同时选中多个卡片批量删除,用下面的写法更稳妥:
func delete(at offsets: IndexSet) { // 先收集所有待删除的卡片ID,此时数组还未修改,索引完全对应 let deleteIds = offsets.compactMap { stripeManager.paymentMethods[$0].id } // 逐个调用Stripe删除接口,若接口支持批量传ID可调整为批量请求 deleteIds.forEach { cardId in stripeManager.detachPaymentMethod(paymentMethodId: cardId) } // 所有接口调用逻辑处理完成后,再统一删除数组元素 stripeManager.paymentMethods.remove(atOffsets: offsets) }
附加优化建议:如果你需要等Stripe接口请求成功后再更新UI删除列表元素,可以把移除数组的逻辑放到
detachPaymentMethod的成功回调里,避免出现接口请求失败但列表已经把卡片删了的数据不一致问题。
内容的提问来源于stack exchange,提问作者devOP1
相关产品推荐
相关产品推荐

