SwiftUI中如何获取List行对应的IndexSet整数值?
解决SwiftUI List .onDelete获取行号的问题
先修正你代码里的两个关键问题:
ForEach直接遍历[String]会编译报错,因为String默认未遵循Identifiable协议,需要改用索引遍历的方式。.onDelete的回调函数不能有返回值,必须是(IndexSet) -> Void类型,不能返回Int。
实现方案
IndexSet本身就存储了被删除元素对应的数组索引(从0开始),你只需要把索引值加1,就能得到从1开始的行号。具体实现如下:
import SwiftUI struct FruitView: View { @State var fruits: [String] = ["banana", "apple", "grape", "pear", "kiwi"] var body: some View { List { // 通过索引遍历,既解决Identifiable问题,又能直接拿到元素索引 ForEach(fruits.indices, id: \.self) { index in Text(fruits[index]) } .onDelete(perform: handleDelete) } } func handleDelete(at indexSet: IndexSet) { // 单删除场景:获取第一个被删元素的索引 if let index = indexSet.first { let rowNumber = index + 1 print("被删除的行号:\(rowNumber),对应水果:\(fruits[index])") } // 批量删除场景:遍历所有被删元素的索引 // for idx in indexSet { // let row = idx + 1 // print("被删除的行号:\(row)") // } } }
关键说明
IndexSet是一个有序整数集合,里面的每一个值都对应List中被删除元素在数组里的0起始索引。- 如果你需要的是从1开始的行号,只需要给索引值加1即可。
- 改用
fruits.indices遍历后,既能避免Identifiable的编译问题,又能直接关联元素的索引,方便后续操作。
内容的提问来源于stack exchange,提问作者Sutton
相关产品推荐
相关产品推荐

