当列表填充数组时,如何在 SwiftUI 中获取列表中元素的索引?

Posted

技术标签:

【中文标题】当列表填充数组时,如何在 SwiftUI 中获取列表中元素的索引?【英文标题】:How to get the index of the element in the List in SwiftUI when the List is populated with the array? 【发布时间】:2020-01-22 15:41:14 【问题描述】:

在我的 SwiftUI 应用程序中,我有一个项目列表。

我正在使用 MenuItems 数组来填充列表

struct MenuItem: Identifiable, Equatable 
                    var id = UUID()
                    var text: String


struct MenuView: View 

var menuItems = [MenuItem(text:"Text1"),MenuItem(text:"Text2")]

                 var body: some View 

                  List 

                                ForEach(menuItems) textItem in

                   Text(textItem.text)

             

        

        

    

问题是,如何获取textItem的索引?

例如,如果我想为奇数行和偶数行设置不同的行颜色,或者我需要为编号为 3 的行实现不同的样式?

在 SwiftUI 中获取 List 中项目索引的最佳方法是什么?

【问题讨论】:

【参考方案1】:

这可以使用.enumerated 来完成。对于您的 MenuItem 值,如下所示

List 
    ForEach(Array(menuItems.enumerated()), id: \.1.id)  (index, textItem) in
        // do with `index` anything needed here
        Text(textItem.text)
    

【讨论】:

这行不通了...我得到 Type '_' has no member '1' @Muvimotv,它适用于主题起始代码。如果它不适用于您的代码,那么您最好使用该代码发布您自己的问题。 ;) 它可以工作,但表现不佳。在简单的情况下是可以的。但是,如果您使用 @FetchRequest 并从 Core Data 获取数据并执行 Array(items.enumerated()) 那么它以次优方式工作,即它一次加载所有项目。如果您在 Item 实体中存储数千行并希望定义 .fetchBatchSize = 10 ,那么它会立即执行所有需要的 FetchRequests 以加载所有数据,如果您在没有此 Array() enumereated() 的情况下进行相同的设置,只需混合 ForEach( menuItems, id: \.self) 它工作性能很好,可以批量加载 10 行!

以上是关于当列表填充数组时,如何在 SwiftUI 中获取列表中元素的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 列表中设置 NavigationLink

无法更改 iOS 15 SwiftUI 列表部分标题填充

检索 JList 项的数组数据

当我们在文本和图像之间切换按钮内容时,如何停止 SwiftUI 更改固定填充?

如何使用@EnvironmentObject 在 SwiftUI 中自动填充和更新列表?

如何在 SwiftUI 中删除列表的左右填充?