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