#swift4.2
#swift4.2
Вопрос:
Внутри происходит сбой runTimer()
из-за двух аргументов. Если я добавляю только один или ничего — все работает нормально. Сбой при пересылке в AppDelegate и ошибка
Поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x4)
var timer = Timer()
var seconds = Int()
@IBOutlet weak var twoMinView: UIView!
@IBOutlet weak var twoMinLabel: UILabel!
@objc func twoMinTimer() {
seconds = 120
runTimer(view: twoMinView, label: twoMinLabel)
}
@objc func runTimer(view: UIView, label: UILabel) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(MyViewController.updateTimer(view:withLabel:)), userInfo: nil, repeats: true)
}
@objc func updateTimer(view: UIView, withLabel label: UILabel) {
seconds -= 1
if seconds < 1 {
view.isHidden = true
timer.invalidate()
if view == twoMinView {
streamView.isHidden = false
}
}
label.text = timeString(time: TimeInterval(seconds))
}
@objc func timeString(time: TimeInterval) -> String {
let minutes = Int(time) / 60 % 60
let seconds = Int(time) % 60
return String(format: "i : i", minutes, seconds)
}
Комментарии:
1. Что такое
withLabel
? разве это не должно быть простоlabel
?2. это может быть, но это не влияет на результат
3. Итак, вы говорите в таймере обновления, что выполнение
view:label:
не имеет значения?4. Именно это я и имею в виду
Ответ №1:
Просто удалите updateTimer
и замените runTimer
следующим
@objc func runTimer(view: UIView, label: UILabel) {
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
if self.seconds < 1 {
view.isHidden = true
timer.invalidate()
if view == self.twoMinView {
self.streamView.isHidden = false
}
}
label.text = self.timeString(time: TimeInterval(self.seconds))
self.seconds -= 1
})
}