TabView 在重绘时是不是会错过导航点击?
Posted
技术标签:
【中文标题】TabView 在重绘时是不是会错过导航点击?【英文标题】:Does TabView miss navigation clicks while redrawing?TabView 在重绘时是否会错过导航点击? 【发布时间】:2021-09-15 06:00:53 【问题描述】:我有一个普通的 TabView、一个@ObservedObject 和一个正在运行的后台任务,它定期更新@ObservedObject 的@Published 字段。
我注意到,当后台任务更频繁地运行并对@ObservedObject 产生更多更改时,TabView 上的导航选项卡的响应速度会降低——它们会“错过”点击。如果我点击两三下,我通常可以改变视图。后台更新越频繁,“错过”点击的次数就越多。
所以我想知道 TabView 在重绘时是否以某种方式未能注意到点击,或者类似的东西?
有什么见解吗?
import Foundation
import SwiftUI
struct ContentView2: View
enum Tabs
case main
case audio
case preferences
@State var tab = Tabs.preferences
@ObservedObject var appState = Globals.appState
var body: some View
TabView(selection: $tab)
MainView()
.tabItem
Image(systemName: "video.fill")
Text("Main")
.tag(Tabs.main)
AudioControlView()
.tabItem
Image(systemName: "speaker.fill")
Text("Audio")
.tag(Tabs.audio)
PreferenceView()
.tabItem
Image(systemName: "gear")
Text("Prefs")
.tag(Tabs.preferences)
【问题讨论】:
TabView
应该完全可以正常工作,但您可能在ObservedObject
内的主线程上进行了一些繁重的计算。添加代码如何更新@Published
字段
确保后台更新是异步完成的
【参考方案1】:
发现问题...
TabView 不需要 @ObservedObject var appState = Globals.appState
,因为 TabView 本身不依赖于 @Published
字段。
相反,需要观察各个选项卡(MainView()
等)。
所以发生的情况是,每次更改都对 TabView 进行了不必要的重新计算和重绘。删除此行修复了所有问题。
【讨论】:
以上是关于TabView 在重绘时是不是会错过导航点击?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI:ObservableObject 在重绘时不会保持其状态