Переключение bool свойства по истечению таймера
Пишу приложения для игры, в игровом view есть кнопка "переворачивания" карточки с вопросом, есть кнопки принятия ответа и нарушения, при нажатии на которые происходит переворачивание карточки, так же есть таймер, проблема заключается в том, что не могу понять, как по истечению времени таймера, переключить bool свойство для переворачивания карточки обратно...
Сама модель таймера
import Foundation
class TimerManager : ObservableObject {
//Свойство режима таймера
@Published var timerMode : TimerMode = .initial
//Свойство количества секунд
@Published var leftSeconds = UserDefaults.standard.integer(forKey: "timerLenght")
var timer = Timer()
//Метод выборки времени для таймера (Возможно позже доделаю)
func setTimerLenght(minutes: Int) {
let defaults = UserDefaults.standard
defaults.setValue(minutes, forKey: "timerLenght")
leftSeconds = minutes
}
//Метод запуска таймера
func start() {
timerMode = .running
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { timer in
if self.leftSeconds == 0 {
self.reset()
}
self.leftSeconds -= 1
})
}
//Метод перезапуска таймера
func reset() {
self.timerMode = .initial
self.leftSeconds = UserDefaults.standard.integer(forKey: "timerLenght")
timer.invalidate()
}
//Метод остановки таймера
func pause() {
self.timerMode = .paused
timer.invalidate()
}
}
//Режимы работы таймера
enum TimerMode {
case running, paused, initial
}
//Конвертирование времени
func secondsToMinutesAndSeconds(seconds: Int) -> String {
let minutes = "\((seconds % 3600) / 60)"
let seconds = "\((seconds % 3600) % 60)"
let minutesStamp = minutes.count > 1 ? minutes : "0" + minutes
let secondsStamp = seconds.count > 1 ? seconds : "0" + seconds
return "\(minutesStamp) : \(secondsStamp)"
}
Игровое View
struct EasyDifficultyView: View {
//Свойство привязки для определения стороны карточки
@State private var flipped : Bool = false
//Свойство привязки для вращения карточки в градусах
@State private var degrees : Double = 180
//Свойства привязки высоты и ширины карточки
@State private var width : CGFloat = 350
@State private var heigh : CGFloat = 230
//Свойство привязки к модели таймера
@ObservedObject var timeManager = TimerManager()
let availableMinutes = 1
var body: some View {
ZStack {
VStack {
//Таймер и его внешний вид с кнопкой включения, текущий игрок
VStack(spacing: 15) {
if teams.teamsArray.count > teamIndex {
Text("Ваша очередь! \(teams.teamsArray[teamIndex].name)")
.font(.custom("coolJazz", size: 30))
}
if timeManager.timerMode == .running {
Text(secondsToMinutesAndSeconds(seconds: timeManager.leftSeconds))
.font(.custom("coolJazz", size: 40))
}
}.padding(.top, 50)
Spacer()
//Две стороны карточки со словом
ZStack {
if flipped {
EasyCardBack(width: self.$width, height: self.$heigh)
} else {
EasyCardFront(width: self.$width, height: self.$heigh)
}
}
.cornerRadius(7.5)
.border(Color.black.opacity(0.8), width: 4)
.cornerRadius(7.5)
.rotation3DEffect(.degrees(degrees), axis: (x: 0, y: 1, z: 0))
//Кнопки включение таймера/пауза
VStack {
HStack(spacing: 20) {
//Принять ответ
Button(action: {
self.flipped = false
withAnimation {
self.degrees -= 180
self.width = 350
self.heigh = 250
}
self.timeManager.pause()
self.timeManager.reset()
}) {
VStack {
Image(systemName: "checkmark")
.padding()
.background(Color.green.opacity(0.9))
.clipShape(Circle())
.font(.system(size: 25))
Text("Правильно!")
.font(.custom("coolJazz", size: 20))
}.foregroundColor(.black)
}
}
.disabled(self.timeManager.timerMode == .running ? false : true)
//Кнопка включения/остановки таймера
Button(action: {
if self.timeManager.timerMode == .initial {
self.timeManager.setTimerLenght(minutes: self.availableMinutes * 5)
}
self.timeManager.timerMode == .running ? self.timeManager.pause() : self.timeManager.start()
if self.flipped {
self.flipped = false
withAnimation {
self.degrees += 180
self.width = 350
self.heigh = 230
}
} else {
self.flipped = true
withAnimation {
self.degrees -= 180
self.width = 350
self.heigh = 230
}
}
}) {
VStack {
Image(systemName: timeManager.timerMode == .running ? "pause.circle" : "play.circle")
.font(.system(size: 57))
Text(self.timeManager.timerMode == . running ? "Пауза" : "Старт")
.font(.custom("coolJazz", size: 20))
}.foregroundColor(.black)
}
//Неправильный ответ
Button(action: {
self.flipped = false
self.timeManager.pause()
self.timeManager.reset()
withAnimation {
self.degrees -= 180
self.width = 350
self.heigh = 250
}
}) {
VStack {
Image(systemName: "xmark")
.padding()
.background(Color.red.opacity(0.9))
.clipShape(Circle())
.font(.system(size: 25))
Text("Нарушение!")
.font(.custom("coolJazz", size: 20))
}.foregroundColor(.black)
}.disabled(self.timeManager.timerMode == .running ? false : true)
}
}.padding(.vertical)
}
Пробовал дописать следующий код в action кнопки таймера в игровом view, но не сработало.
if self.timeManager.leftSeconds == 0 {
self.flipped = false
}
Может кто нибудь подсказать, где здесь ошибка и как поправить, чтобы карточка переворачивалась обратно?