繁体   English   中英

在 Swift 中重新发送 OTP 定时器功能

[英]Resend OTP timer functionality in Swift

我想设置一个 30 秒的计时器来向电话号码发送 OTP。 在计时器运行时,应禁用重新发送 OTP 按钮。 定时器结束后,重新发送 OTP 按钮应启用,定时器 label 应隐藏。 Onclick 的重新发送 OTP 按钮,同样的过程应该继续。

在我编写的代码中,计时器 label 一直处于隐藏状态,并且不断进入 if 循环,在那里它不断打印“无效”。

下面是我写的代码。

更新代码:

    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var resendOTPBtn: UIButton!

  var countdownTimer: Timer!
    var totalTime = 30

 override func viewDidLoad() {
        super.viewDidLoad()
 if AFWrapper.isConnectedToInternet() {
            timerLabel.text = ""
            sendOTPCode()
            sendOTPAPICall()
        resendOTPBtn.isEnabled = false
        } else {
            self.textPopupAlert(title: ALERT_TITLE, message: OFFLINE_MSG)
        }
}

  // in case user closed the controller
     deinit {
         countdownTimer.invalidate()
     }
    
    @objc func updateTimerLabel() {
        totalTime -= 1
        timerLabel.text = "\(timeFormatted(totalTime))"
       if totalTime == 0 {
           timerLabel.text = ""
           countdownTimer.invalidate()
           resendOTPBtn.isEnabled = true

       }

     }

  @IBAction func resendOTPBtnClicked(_ sender: Any) {
        if AFWrapper.isConnectedToInternet() {
            sendOTPAPICall()
            timerLabel.text = ""
            totalTime = 31
            resendOTPBtn.isEnabled = false
            sendOTPCode()
        }
        else {
            self.textPopupAlert(title: ALERT_TITLE, message: OFFLINE_MSG)
        }

    }


func sendOTPCode() {
          self.countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateTimerLabel), userInfo: nil, repeats: true)
}

初始代码:

@IBAction func resendOTPBtnClicked(_ sender: Any) {
        if AFWrapper.isConnectedToInternet() {
            sendOTPAPICall()
            countDownTime()
        }
        else {
            self.textPopupAlert(title: ALERT_TITLE, message: OFFLINE_MSG)
        }

    }





func countDownTime() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 60) {
                self.timerLabel.isHidden = false
            self.resendOTPBtn.isEnabled = false
        if self.timerLabel.isHidden == false {
            self.startTimer()
        } else {
            self.countdownTimer.invalidate()
            self.resendOTPBtn.isEnabled = true
            self.timerLabel.isHidden = true

        }
        }

    }





 // Method to start the timer when resend OTP button is clicked.
    func startTimer() {
            countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
        
        }
    


    @objc func updateTime() {
        DispatchQueue.main.async(){
            self.timerLabel.text = self.timeFormatted(self.totalTime)
                if self.totalTime != 0 {
                self.totalTime -= 1
            } else {
                print("Invalidated")
                self.endTimer()

            }
    }
        }


 func timeFormatted(_ totalSeconds: Int) -> String {
            let seconds: Int = totalSeconds % 60
            let minutes: Int = (totalSeconds / 60) % 60
            //     let hours: Int = totalSeconds / 3600
            return String(format: "%02d:%02d", minutes, seconds)
        }

任何解决方案将不胜感激。 谢谢!

@IBOutlet weak var resendCodeTimerLabel: UILabel!
  @IBOutlet weak var resendCodeButton: UIButton!
  var resendCodeCounter = 30
  var resendCodeTimer = Timer()
  override func viewDidLoad() {
    super.viewDidLoad()
    resendCodeTimerLabel.text = ""
    sendOTPCode()
  }
 // in case user closed the controller
  deinit {
    resendCodeTimer.invalidate()
  }
  @objc func updateTimerLabel() {
    resendCodeCounter -= 1
    resendCodeTimerLabel.text = "Resend code in \(resendCodeCounter) seconds."
    if resendCodeCounter == 0 {
      resendCodeButton.isEnabled = true
      resendCodeTimer.invalidate()
    }
  }
  @IBAction func resendAgainButtonClicked(_ sender: UIButton) {
    OTPTextField.text = ""
    resendCodeCounter = 31
    resendCodeButton.isEnabled = false
    sendOTPCode()
  }
func sendOTPCode() {
//Whatever your api logic
        if otpSent {
          self.resendCodeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateTimerLabel), userInfo: nil, repeats: true)
        }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM