【发布时间】:2021-04-08 03:00:28
【问题描述】:
这真是让我抓狂。我在这里尝试了各种组合,甚至达到了这一点。它有时有效,有时无效。当它确实工作时,它会在后台自行停止。请帮忙。总的来说,我对编码完全是个菜鸟,并且一直在尝试许多不同的方法,所以我对这个问题表示歉意。
if inspectionTime == true {
if stopWatchManager.mode == .stopped {
ZStack{
HStack {
if stopWatchManager.minutesElapsed > 0 {
if stopWatchManager.secondsElapsed < 10 {
Text("\(stopWatchManager.minutesElapsed) :0")
.font(.largeTitle)
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
})
.foregroundColor(isPressingDown ? .green : .white)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
}
else {
Text("\(stopWatchManager.minutesElapsed) :")
.font(.largeTitle)
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
})
.foregroundColor(isPressingDown ? .green : .white)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
}
}
Text("\(stopWatchManager.secondsElapsed, specifier: "%.02f")")
.font(.largeTitle)
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
})
.foregroundColor(isPressingDown ? .green : .white)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
.onChange(of: isPressingDown, perform: { value in
if isPressingDown == false {
if session.state == WKExtendedRuntimeSessionState.notStarted{
session.start()}
if showCountdown == false {
showCountdown = true
DispatchQueue.main.asyncAfter(deadline: .now() + 13.5){
if showCountdown == true {
stopWatchManager.start()
showCountdown = false}
}
}
else if showCountdown == true{
stopWatchManager.start()
showCountdown = false
}
turnGreen = false
}
else if isPressingDown == true{
// DispatchQueue.main.asyncAfter(deadline: .now() + 0.5){
WKInterfaceDevice.current().play(.click)
// }
}
if showCountdown == true && isPressingDown == true {
turnGreen = true
}
})
}
if showCountdown == true {
CountdownView()}
Rectangle()
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
showCountdown = false
})
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
.opacity(0.1)
.foregroundColor(.black)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($testing) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
}
}
else if stopWatchManager.mode == .running {
ZStack{
HStack{
if stopWatchManager.minutesElapsed > 0 {
if stopWatchManager.secondsElapsed < 10 {
Text("\(stopWatchManager.minutesElapsed) :0")
.font(.largeTitle)
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
})
.foregroundColor(isPressingDown ? .green : .white)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
}
else {
Text("\(stopWatchManager.minutesElapsed) :")
.font(.largeTitle)
// .frame(width: 500.0, height: 500.0)
.contentShape(Rectangle())
.onTapGesture(count: 2, perform: {
stopWatchManager.resetToZero()
})
.foregroundColor(isPressingDown ? .green : .white)
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
}
}
Text(String(format: "%.02f", stopWatchManager.secondsElapsed))
.font(.largeTitle)
//.frame(width: 500.0, height: 500.0)
.contentShape(Rectangle())
.onTapGesture {
if stopWatchManager.mode == .running {
stopWatchManager.stop()
}
}
.onChange(of: stopWatchManager.secondsElapsed, perform: {value in
if stopWatchManager.secondsElapsed >= 60{
stopWatchManager.secondsElapsed = 0
stopWatchManager.minutesElapsed = stopWatchManager.minutesElapsed + 1
}})
}
Rectangle()
.contentShape(Rectangle())
.onTapGesture{
if stopWatchManager.mode == .running {
stopWatchManager.stop()
}
}
.gesture(LongPressGesture(minimumDuration: 0.5)
.sequenced(before: LongPressGesture(minimumDuration: .infinity))
.updating($isPressingDown) { value, state, transaction in
switch value {
case .second(true, nil): //This means the first Gesture completed
state = true
default: break
}
})
.opacity(0.01)
.foregroundColor(.black)}}}
class StopWatchManager: ObservableObject {
var session = WKExtendedRuntimeSession()
let scoreList = ScoreList()
@AppStorage("countdown") var countdown = "15"
@AppStorage("bigDNF") var bigDNF: Bool = false
@Published var secondsElapsed = 0.00
@Published var minutesElapsed = 0
@Published var mode: stopWatchMode = .stopped
@State private var timeRemaining = 100
let countdownTimer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
@ObservedObject var scoreStore = ScoreStore()
@AppStorage("newScore") var newScore = ""
@AppStorage("save") var save = false
@AppStorage("plus2") var plus2 = false
var timer = Timer()
func start() {
session = WKExtendedRuntimeSession()
if session.state == WKExtendedRuntimeSessionState.notStarted{
session.start()}
mode = .running
WKInterfaceDevice.current().play(.start)
secondsElapsed = 0
minutesElapsed = 0
timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
self.secondsElapsed += 0.01
}
}
func stop() {
let formattedSeconds = String(format: "%.02f", secondsElapsed)
timer.invalidate()
mode = .stopped
WKInterfaceDevice.current().play(.start)
if plus2 == true {
secondsElapsed = secondsElapsed + 2
}
//DispatchQueue.main.asyncAfter(deadline: .now() + 1.0)
if minutesElapsed > 0{
newScore = "\(minutesElapsed) :\(formattedSeconds)"
save = true
}
else {
newScore = "\(formattedSeconds)"
}
save = true
// session.invalidate()
}
func resetToZero() {
secondsElapsed = 0
minutesElapsed = 0
WKInterfaceDevice.current().play(.click)
bigDNF = false
}
}
【问题讨论】:
-
您在 info.plist 中配置了哪种扩展运行时会话?老实说,这可能不是创建秒表的最佳方式。您只需在秒表启动时记录
Date,然后您就可以轻松确定经过的时间。当您的应用实际在屏幕上时,您只需要一个计时器来定期更新经过的时间。如果你坚持开始日期(比如UserDefaults),那么你不需要你的应用程序继续运行。这样电池效率更高 -
我将不得不研究这种方法,谢谢!我对完全编码仍然非常陌生,并且在研究时发现了这种方法。然而,使用这种方法,我并没有触及绘图文件本身。我确实将背景模式设置为物理治疗会话类型。甚至尝试在其上启用音频。我在控制台中也看到了一些错误:“Error Domain=com.apple.CarouselServices.SessionErrorDomain Code=19 “no client found for pid””和“WKExtendedRuntimeObject 在运行时被释放。使会话无效”
标签: ios swift swiftui watch watchos