@State变量以较高的频率刷新视图时,导航栏/工具栏按钮无法正常工作

沃尔克88

我注意到,当至少有一个@State变量经常刷新视图时,导航栏/工具栏按钮无法正常工作。

我创建了一个简单的应用程序对其进行测试。

在下面的代码示例中,您有3个触发模板的选项。在主视图中一个按钮,在工具栏中一个按钮,在导航栏中一个按钮。

当我的计时器未更新“数字”时,所有3个按钮均正常工作。当我启动计时器时,它将每隔0.1秒刷新一次视图,只有每次主视图中的按钮才会起作用。工具栏/导航栏中的按钮大部分时间都不起作用。(我的计时器的TimeInterval越短,按钮的作用就越少)

import SwiftUI

struct ContentView: View {

    @State private var number = 0
    @State private var showModal = false

    func startTimer() {
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (_) in
            number += 1
        }
    }

    var body: some View {

        NavigationView {
            VStack {
                Text("Count \(number)")
                Button(action: startTimer, label: {
                    Text("Start Timer")
                })

                Button(action: { showModal.toggle() }, label: {
                    Text("Open Modal")
                })
            }
            .navigationBarTitle("Home", displayMode: .inline)
            .navigationBarItems(leading:
                                    Button(action: {
                                        showModal.toggle()
                                    }, label: {
                                        Text("Open Modal")
                                    }))

            .toolbar {
                ToolbarItem(placement: .bottomBar) {
                    Button(action: {
                        showModal.toggle()
                    }, label: {
                        Text("Open Modal")
                    })
                }
            }
        }

        .sheet(isPresented: $showModal, content: {
            Text("Hello, World!")
        })

    }
}

有没有人知道是否有办法使两个按钮正常工作?

Xcode 12 beta 5和Xcode Xcode 11.6会发生此问题(没有工具栏,因为那里不可用)

他的脾气

number提供的变体中状态会刷新整个视图,这是问题的结果,对于UI而言不是非常理想。

导航栏的解决方案(通常是好的样式)是将刷新部分分为独立视图,因此SwiftUI渲染引擎仅重建它。

经过Xcode 12b3 / iOS 14测试

struct TestOftenUpdate: View {

    @State private var showModal = false

    var body: some View {

        NavigationView {
            VStack {
                QuickTimerView()
                Button(action: { showModal.toggle() }, label: {
                    Text("Open Modal")
                })
            }
            .navigationBarTitle("Home", displayMode: .inline)
            .navigationBarItems(leading:
                                    Button(action: {
                                        showModal.toggle()
                                    }, label: {
                                        Text("Open Modal")
                                    }))

            .toolbar {
                ToolbarItem(placement: .bottomBar) {
                    Button(action: {
                        showModal.toggle()
                    }, label: {
                        Text("Open Modal")
                    })
                }
            }
        }

        .sheet(isPresented: $showModal, content: {
            Text("Hello, World!")
        })

    }
}

struct QuickTimerView: View {
    @State private var number = 0

    var body: some View {
        VStack {
            Text("Count \(number)")
            Button(action: startTimer, label: {
                Text("Start Timer")
            })
        }
    }

    func startTimer() {
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (_) in
            number += 1
        }
    }

}

Withtoolbar是另一个问题-即使没有计时器视图,在打开第一个工作表后它也不起作用,这就是为什么

演示

如图所示,按钮布局已损坏且位于工具栏区域之外,这就是为什么命中测试失败的原因-这是应该报告的Apple缺陷。

解决方法1:

将工具栏放置在导航视图之外(在视觉上工具栏较小,但有时可能是合适的,因为按钮起作用了)

    NavigationView {
       // ... other code
    }
    .toolbar {
        ToolbarItem(placement: .bottomBar) {
            Button(action: {
                showModal.toggle()
            }, label: {
                Text("Open Modal")
            })
        }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

工具栏的重力(或位置)在CollapsingToolbarLayout中无法正常工作

来自分类Dev

Android工具栏setNavigationIcon无法正常工作

来自分类Dev

工具栏中的主菜单无法正常工作

来自分类Dev

工具栏的重力(或位置)在CollapsingToolbarLayout中无法正常工作

来自分类Dev

聚合物纸工具栏无法正常工作

来自分类Dev

导航栏无法正常工作

来自分类Dev

设置工具栏颜色和导航栏后退按钮

来自分类Dev

导航栏菜单按钮动画无法正常工作

来自分类Dev

Matlab GUIDE工具栏上的工具的ButtonDownFcn无法正常工作

来自分类Dev

如何在jqgrid工具栏上添加刷新按钮?

来自分类Dev

获取工具栏的导航图标视图参考

来自分类Dev

工具栏显示在导航栏中

来自分类Dev

视图与工具栏重叠

来自分类Dev

隐藏滚动条上的工具栏将无法正常工作[CoordinatorLayout]

来自分类Dev

Android支持v7工具栏setTitleTextAppearance无法正常工作

来自分类Dev

Android支持v7工具栏setTitleTextAppearance无法正常工作

来自分类Dev

具有不同菜单和通用工具栏的Viewpager无法正常工作

来自分类Dev

Extjs 5.1:overflowHandler:'菜单'对于工具栏无法正常工作

来自分类Dev

滑动刷新时工具栏不显示

来自分类Dev

Excel工具栏按钮

来自分类Dev

导航栏下拉列表无法正常工作

来自分类Dev

Aurelia导航栏VM无法正常工作

来自分类Dev

导航栏在jQuery中无法正常工作

来自分类Dev

我的固定导航栏无法正常工作

来自分类Dev

HTML导航栏换行/无法正常工作

来自分类Dev

粘性导航栏无法正常工作

来自分类Dev

导航栏无法正常工作-Django

来自分类Dev

jQuery导航栏动画无法正常工作

来自分类Dev

我的引导导航栏无法正常工作

Related 相关文章

热门标签

归档