gpt4 book ai didi

swift - 当@State 变量以高频率刷新 View 时,导航栏/工具栏按钮工作不可靠

转载 作者:行者123 更新时间:2023-12-03 09:23:01 25 4
gpt4 key购买 nike

我注意到当至少有一个 @State 变量经常刷新 View 时,导航栏/工具栏按钮无法正常工作。
我创建了一个简单的应用程序来测试它。
在下面的代码示例中,您有 3 个选项来触发模式表。一个按钮在主 View 中,一个在工具栏中,一个在导航栏中。
当我的计时器没有更新“数字”时,所有 3 个按钮都正常工作。当我启动计时器时,它将每 0,1 秒刷新一次 View ,只有主 View 中的按钮每次都会工作。工具栏/导航栏中的按钮大部分时间都不起作用。 (我的计时器的 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!")
})

}
}
有没有人知道是否有办法使 2 个按钮正常工作?
此问题发生在 Xcode 12 beta 5 和 Xcode Xcode 11.6(没有工具栏,因为它在那里不可用)

最佳答案

number提供的变体中的状态刷新整个 View ,这是问题的结果,对于 UI 来说不是很理想。
导航栏的解决方案,总体来说还是不错的风格,就是将刷新部分拆分成独立的 View ,所以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
}
}

}
toolbar是不同的问题 - 即使没有定时器 View ,它在第一张纸打开后也不起作用 ,这就是为什么
demo
正如所见,按钮布局已损坏且位于工具栏区域之外,这就是 HitTest 失败的原因 - 这是应该报告的 Apple 缺陷。
解决方法 1:
将工具栏放置在导航 View 之外(视觉工具栏较小,但有时可能是合适的,因为按钮有效)
    NavigationView {
// ... other code
}
.toolbar {
ToolbarItem(placement: .bottomBar) {
Button(action: {
showModal.toggle()
}, label: {
Text("Open Modal")
})
}
}

关于swift - 当@State 变量以高频率刷新 View 时,导航栏/工具栏按钮工作不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63540602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com