首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计时器正在运行时,SwiftUI ActionSheet不会关闭

计时器正在运行时,SwiftUI ActionSheet不会关闭
EN

Stack Overflow用户
提问于 2020-08-02 12:36:30
回答 1查看 462关注 0票数 1

我有以下简单的SwiftUI设置。正在运行并更新文本的计时器。如果计时器没有运行(停止或暂停),我可以很容易地显示一个ActionSheet (通过点击Actions),并通过选择"Cancel“或”Action1“选项来关闭它。但是如果计时器正在运行,我很难通过选择"Cancel“或”Action1“选项来关闭ActionSheet。你知道发生了什么事吗?

我使用的是Xcode11.5。

代码语言:javascript
复制
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()
    }
}
代码语言:javascript
复制
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
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-02 13:35:34

在Xcode12/ iOS 14上运行良好,但尝试将带有工作表的按钮分离到另一个子视图中,以避免在计时器计数器刷新时重新创建它。

使用Xcode12/ iOS 14进行测试

代码语言:javascript
复制
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()])
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63212432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档