Приложение вылетает после таймера вместо кнопки повторного включения - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в XCode, поэтому любая помощь будет оценена.

При нажатии кнопки кнопка должна быть отключена и должна отображать случайное число и запускать таймер.Когда таймер установлен, кнопка снова активируется.

Вот код кнопки:

@IBAction func MarketButton(_ sender: UIButton) {
    let t = Int(arc4random_uniform(10))
    MarketLabel.text = String (t)
    let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(MarketViewController.MarketButton), userInfo: nil, repeats: false)
    sender.isEnabled = !(timer.isValid )

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

добро пожаловать в переполнение стека.Позвольте мне рассказать вам о том, что делает ваш код в данный момент после нажатия кнопки.

  1. создайте случайное число от 0 до 10
  2. поместите число в метку
  3. Запланируйте таймер для запуска той же функции.
  4. Если таймер действителен, кнопка будет отключена.Если таймер недействителен, он активирует кнопку.

Однако после срабатывания таймера он вызывает ту же функцию.На этот раз он не будет иметь тот же параметр, хотя.При первом запуске кнопка передавала себя функции в качестве первого параметра.На этот раз таймер будет первым аргументом.К сожалению, это происходит из-за того, что API селектора небезопасен.Итак, вот что происходит, как только запускается таймер:

  1. Функция вызывается
  2. , случайное число генерируется и записывается на вашу метку
  3. новыйтаймер запускается
  4. Целевая среда выполнения C, в которой работает ваше приложение iOS, пытается найти и свойство isEnabled, которое не будет найдено в вашем таймере, и оно будет аварийно завершать работу.

Поэтому для вашего таймера крайне важно вызвать другую функцию, подобную предложенной @boidkan.Я бы предложил что-то вроде этого:

class TimebombViewController {
    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!

    var timer: Timer?
    @IBAction startButtonPressed(_ sender:UIButton){
        timerLabel.text = Int(arc4random_uniform(10)).description
        timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(timerFired), userInfo: nil, repeats: false)
        refreshButtonState()
    }

    @objc timerFired(_ timer:Timer){
        timer = nil
        refreshButtonState()
    }

    func refreshButtonState(){
        startButton.isEnabled = !(timer?.isValid ?? false)
    }

}
0 голосов
/ 21 сентября 2018

У вас есть несколько проблем здесь:

Что вызывает сбой, так это то, что MarketButton требует, чтобы вы передавали UIButton в качестве параметров, которые таймер не выполняет при запуске.Вы можете сделать это, передав кнопку через параметр userInfo scheduledTimer.Вот пост переполнения стека о том, как , что .

Однако, даже после того, как вы это сделаете, все равно не будет работать.Вам нужно создать метод для обработки, когда таймер завершит работу.

Что-то вроде:

func enableButton() {
    yourButton.isEnabled = true
}

И затем поместите его в качестве селектора вместо метода MarketButton.

примерно так:

let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(enableButton), userInfo: nil, repeats: false)

Помещая MarketButton в качестве селектора таймера, вы создаете бесконечный цикл.Когда таймер завершает работу, он вызывает метод, который затем запускает другой таймер и т. Д.

Другая проблема связана с этими двумя строками кода:

let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(MarketViewController.MarketButton), userInfo: nil, repeats: false)
sender.isEnabled = !(timer.isValid )

В этом случае таймер будет почти всегдабыть действительным, потому что вы просто установите его.Так что !(timer.isValid) будет в основном всегда возвращать false.Однако, если вы последуете моему совету и вызовете другой метод вместо MarketButton, тогда это не будет проблемой.

Также примечание: при именовании функций не следует использовать их заглавные буквы, поэтому MarketButton должно бытьmarketButton.

Я предлагаю попытаться найти решение с информацией, которую я вам дал.Если у вас есть какие-либо вопросы, дайте мне знать и добро пожаловать в переполнение стека!

...