You need to enable JavaScript to run this app. SwiftUI中如何获取List列表已删除行对应的元素ID
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 08:54:03