gpt4 book ai didi

ios - 计时器运行时,SwiftUI ActionSheet 不会关闭

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

我有以下简单的 SwiftUI 设置。正在运行和更新文本的计时器。如果计时器没有运行(停止或暂停),我可以轻松地显示一个 ActionSheet(通过点击 Actions)并通过选择“Cancel”或“Action 1”选项将其关闭。但是,如果计时器正在运行,我很难通过选择“取消”或“操作 1”选项之一来关闭 ActionSheet。你知道发生了什么事吗?
我正在使用 Xcode 11.5。

import SwiftUI

struct ContentView: View {

@ObservedObject var stopWatch = StopWatch()
@State private var showActionSheet: Bool = false

var body: some View {
VStack {
Text("\(stopWatch.secondsElapsed)")
HStack {
if stopWatch.mode == .stopped {
Button(action: { self.stopWatch.start() }) {
Text("Start")
}
} else if stopWatch.mode == .paused {
Button(action: { self.stopWatch.start() }) {
Text("Resume")
}
} else if stopWatch.mode == .running {
Button(action: { self.stopWatch.pause() }) {
Text("Pause")
}
}
Button(action: { self.stopWatch.stop() }) {
Text("Reset")
}
}
Button(action: { self.showActionSheet = true }) {
Text("Actions")
}
.actionSheet(isPresented: $showActionSheet) {
ActionSheet(title: Text("Actions"), message: nil, buttons: [.default(Text("Action 1")), .cancel()])
}
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
import SwiftUI

class StopWatch: ObservableObject {

@Published var secondsElapsed: TimeInterval = 0.0
@Published var mode: stopWatchMode = .stopped

var timer = Timer()
func start() {
mode = .running
timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timer in
self.secondsElapsed += 0.1
}
}

func stop() {
timer.invalidate()
secondsElapsed = 0
mode = .stopped
}

func pause() {
timer.invalidate()
mode = .paused
}

enum stopWatchMode {
case running
case stopped
case paused
}
}

最佳答案

适用于 Xcode 12/iOS 14,但尝试将带有工作表的按钮分离到另一个 subview 中,以避免在计时器计数器刷新时重新创建它。
使用 Xcode 12/iOS 14 测试

struct ContentView: View {

@ObservedObject var stopWatch = StopWatch()
// @StateObject var stopWatch = StopWatch() // << used for SwiftUI 2.0
@State private var showActionSheet: Bool = false

var body: some View {
VStack {
Text("\(stopWatch.secondsElapsed)")
HStack {
if stopWatch.mode == .stopped {
Button(action: { self.stopWatch.start() }) {
Text("Start")
}
} else if stopWatch.mode == .paused {
Button(action: { self.stopWatch.start() }) {
Text("Resume")
}
} else if stopWatch.mode == .running {
Button(action: { self.stopWatch.pause() }) {
Text("Pause")
}
}
Button(action: { self.stopWatch.stop() }) {
Text("Reset")
}
}
ActionsSubView(showActionSheet: $showActionSheet)
}
}
}

struct ActionsSubView: View {
@Binding var showActionSheet: Bool
var body: some View {
Button(action: { self.showActionSheet = true }) {
Text("Actions")
}
.actionSheet(isPresented: $showActionSheet) {
ActionSheet(title: Text("Actions"), message: nil, buttons: [.default(Text("Action 1")), .cancel()])
}
}
}

关于ios - 计时器运行时,SwiftUI ActionSheet 不会关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63212432/

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