簡體   English   中英

SwiftUI ActionSheet 在計時器運行時不會關閉

[英]SwiftUI ActionSheet does not dismiss when timer is running

我有以下簡單的 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 一起工作正常,但嘗試將帶有工作表的按鈕分離到另一個子視圖中,以避免在計時器計數器刷新時重新創建它。

用 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()])
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM