我有以下简单的SwiftUI设置。正在运行并更新文本的计时器。如果计时器没有运行(停止或暂停),我可以很容易地显示一个ActionSheet (通过点击Actions),并通过选择"Cancel“或”Action1“选项来关闭它。但是如果计时器正在运行,我很难通过选择"Cancel“或”Action1“选项来关闭ActionSheet。你知道发生了什么事吗?
我使用的是Xcode11.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
}
}发布于 2020-08-02 13:35:34
在Xcode12/ iOS 14上运行良好,但尝试将带有工作表的按钮分离到另一个子视图中,以避免在计时器计数器刷新时重新创建它。
使用Xcode12/ 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()])
}
}
}https://stackoverflow.com/questions/63212432
复制相似问题