2017-01-10 6 views
1

Я работаю над простым таймером обратного отсчета (Swift). Когда время достигнет «0», я хочу показать alertView. Для этого я использую JSSAlertView pod.Попытка представить <JSSAlertView.JSSAlertView ... который уже представляет

Все работает хорошо, но с этим alertView Я также получаю это: Предупреждение: Попытка представить, на котором уже представляя

Как я могу это исправить?

Я не использую файл раскадровки или Xib. Все было написано программно.
Я искал различные решения, найденные с помощью Google, - ничего не работало для меня.

P.S. Я прикрепил свой код ниже. У меня есть два ViewControllers:

Первый ViewController имеет кнопки пуска:

class FirstViewController: UIViewController { 

func startButtonCLicked(_ button: UIButton) { 
     let controller = SecondViewController() 
     present(controller, animated: true) 
    } 
} 

Второй ViewController имеет функцию таймера и alertView:

class SecondViewController: UIViewController { 

func updateTimer() { 
     if seconds > 0 { 
      print(seconds) 
      seconds -= 1 

      timerLabel.text = String(Timer.timeFormatted(seconds)) 

     } else { 
      let alertview = JSSAlertView().show(self, 
               title: "Hey", 
               text: "Hey", 
               buttonText: "Hey", 
               color: UIColorFromHex(appColor.hexMainOrangeColor, alpha: 1)) 

      alertview.setTextTheme(.light) 
     } 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     if timer.isValid == false { 
      timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(SecondViewController.updateTimer) , userInfo: nil, repeats: true) 
     } 
     } 
    } 

Ура!

+0

не знаю с JSAlertview, но http://stackoverflow.com/questions/36450931/countdown-in-uialertcontroller может помочь –

+0

Спасибо, Майк Алтер, но это немного другое ... Мой друг просто помог мне решить эту проблему. – Jonagold

ответ

0

Решено.

Я получаю эту ошибку, потому что, как только «секунды == 0» Я начал постоянно называемые alertView:

func updateTimer() { 
     if seconds > 0 { 
      print(seconds) 
      seconds -= 1 
      timerLabel.text = String(Timer.timeFormatted(seconds)) 
     } else { 
      let alertview = JSSAlertView().show(self, 
               title: "Hey", 
               text: "Hey", 
               buttonText: "Hey", 
               color: UIColorFromHex(appColor.hexMainOrangeColor, alpha: 1)) 
      alertview.setTextTheme(.light) 
     } 
    } 

, чтобы исправить это, я создал глобальный Bool - secondsLeft и назначил его ложный. Я поставил этот Bool внутри моего кода, как это:

func updateTimer() { 
     if seconds > 0 { 
      print(seconds) 
      seconds -= 1 

      timerLabel.text = String(Timer.timeFormatted(seconds)) 

     } else if seconds == 0 && !secondsLeft { 

      secondsLeft = true 
      let alertview = JSSAlertView().show(self, 
               title: "Hey", 
               text: "Hey", 
               buttonText: "Hey", 
               color: UIColorFromHex(appColor.hexMainOrangeColor, alpha: 1)) 

      alertview.setTextTheme(.light) 
      alertView.addAction(
      self.dismiss(self, animated: true, completion: nil)) 
     } 
    } 

Теперь, прежде чем позвонить alertView я проверяю, если секунд == 0 и secondsLeft == ложь. Если да, появляется alertView, secondsLeft становится - true, и я больше не вызываю alertView. Внутри viewDidAppear Я снова назначаю secondsLeft false.

override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     secondsLeft = false 

     if timer.isValid == false { 
      timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(SecondViewController.updateTimer) , userInfo: nil, repeats: true) 
     } 
     } 
    } 

Таким образом, это работает ... но теперь я получаю еще один Warning: Attempt to present <JSSAlertView.JSSAlertView: 0x7feb1c830a00> on <MyApp.TimerViewController: 0x7feb1be05650> whose view is not in the window hierarchy!

Любые идеи?

Смежные вопросы