SwiftUI 没有使用 List 和 TabView 正确处理 @State

Posted

技术标签:

【中文标题】SwiftUI 没有使用 List 和 TabView 正确处理 @State【英文标题】:SwiftUI not handling @State correctly with List and TabView 【发布时间】:2020-06-06 16:21:49 【问题描述】:

我有一个包含列表和其他一些视图的 TabView。当用户在 List 中选择了一个项目然后更改了选中的 tabbar,tabbar 的选中状态不会更新,如果用户再次更改选中的 tabbar,SwiftUI 将同时呈现两个内容。

下面的视频可以更好地解释正在发生的事情: https://www.dropbox.com/s/g4d0m56tps2ar0w/swiftUIBug.mov?dl=0

这是完整的代码:

import SwiftUI

struct ListView: View 
    @State var items = ["a", "b", "c"]
    @State var selectedItem: String?

    var body: some View 
        List(selection: $selectedItem) 
            ForEach(items, id: \.self)  item in
                Text(item)
            
        
    


struct ContentView: View 
    @State var selectedView = 1

       var body: some View 
           VStack 
               TabView(selection: $selectedView) 
                   ListView()
                       .padding().tabItem 
                           Text("1")
                   .tag(1)

                   Text("2")
                       .padding().tabItem 
                           Text("2")
                   .tag(2)

                Text("3")
                       .padding().tabItem 
                           Text("3")
                   .tag(3)

               .padding()
           
       

为什么 SwiftUI 不尊重 TabView 的 @State?这只发生在用户选择列表中的一个项目后,如果没有选择任何项目,一切正常。

【问题讨论】:

不是状态——是List激活,绝对是SwiftUI的bug,值得向苹果反馈。 【参考方案1】:

您需要将 ListView 的 @State var selectedItem: String? 更改为 @Binding var selectedItem: String。然后在 TabView 中,ListView(selectedItem: $selectedView)

【讨论】:

以上是关于SwiftUI 没有使用 List 和 TabView 正确处理 @State的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView 或 List,如何制作特定的可滚动视图 (SwiftUI)

从 SwiftUI List 访问底层 UITableView

SwiftUI找回丢失的列表视图(List)动画

SwiftUI找回丢失的列表视图(List)动画

SwiftUI List() 在 macOS 上不显示 .children

SwiftUI List with Divider 但在 MacOS 中没有额外的 Insets