为啥列表的第一项显示在打开的工作表上

Posted

技术标签:

【中文标题】为啥列表的第一项显示在打开的工作表上【英文标题】:Why the first item of the list is displayed all the on the opened sheet为什么列表的第一项显示在打开的工作表上 【发布时间】:2020-03-17 15:42:32 【问题描述】:

我正在将绑定变量传递给其他视图:

struct PocketlistView: View 

    @ObservedObject var pocket = Pocket()
    @State var isSheetIsVisible = false


    var body: some View 

        NavigationView
            List
                ForEach(Array(pocket.pockets.enumerated()), id: \.element.id)  (index, pocketItem) in
                    VStack(alignment: .leading)
                        Text(pocketItem.name).font(.headline)
                        Text(pocketItem.type).font(.footnote)
                    
                    .onTapGesture 
                        self.isSheetIsVisible.toggle()
                    
                    .sheet(isPresented: self.$isSheetIsVisible)
                        PocketDetailsView(pocketItem: self.$pocket.pockets[index])
                    
                
            
            .listStyle(GroupedListStyle())
            .navigationBarTitle("Pockets")
        
    

另一种观点是:

struct PocketDetailsView: View 

    @Binding var pocketItem: PocketItem

    var body: some View 
        Text("\(pocketItem.name)")
    

为什么我在打开第二行或第三行的工作表时看到第一项? 当我使用 NavigationLink 而不是 .sheet 时,它可以完美运行

【问题讨论】:

【参考方案1】:

您一次激活所有工作表,尝试以下方法(我无法测试您的代码,但想法应该很清楚)

struct PocketlistView: View 

    @ObservedObject var pocket = Pocket()
    @State var selectedItem: PocketItem? = nil


    var body: some View 

        NavigationView
            List
                ForEach(Array(pocket.pockets.enumerated()), id: \.element.id)  (index, pocketItem) in
                    VStack(alignment: .leading)
                        Text(pocketItem.name).font(.headline)
                        Text(pocketItem.type).font(.footnote)
                    
                    .onTapGesture 
                        self.selectedItem = pocketItem
                    
                
            
            .listStyle(GroupedListStyle())
            .navigationBarTitle("Pockets")
            .sheet(item: self.$selectedPocket)  item in
                PocketDetailsView(pocketItem: 
                    self.$pocket.pockets[self.pocket.pockets.firstIndex(of: item)!])
            

        
    

【讨论】:

以上是关于为啥列表的第一项显示在打开的工作表上的主要内容,如果未能解决你的问题,请参考以下文章

ListView 仅显示数组列表中的第一项

为啥我不能选择侧面菜单中的第一项?

从数据结构中间层中剔除值

为啥 Impala 不能在 hbase 表上工作?

为啥尝试自动调整工作表的宽度或该工作表上的单个列会失败?

Excel UDF 对变量工作表的范围求和