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 在重绘时不会保持其状态

WinForm防止界面闪烁

.Net CF 防止过度、不耐烦的点击(屏幕重绘时)

iOS:当视图中有两个小的不相邻区域需要重绘时,调用两次 setNeedsDisplayInRect 是不是更快?

重绘时文本字段变形

在 MFC 中重绘时闪烁