json - 如何给一些时间(60 秒)快速重新发送 OTP 按钮
问题描述
我有带有 OTP 验证的注册屏幕。一旦我点击 regstrButton,然后 OTP 将被发送到注册的手机号码。当时重新发送 otp 按钮将在 60 秒后显示时间 60 秒,如果我点击重新发送 otp 按钮,那么我需要重新发送 otp到注册号码.. 如下图
重新发送按钮需要显示 60 秒后我需要重新发送 otp 如何?
我的 otp 服务代码:
import UIKit
class RegistrationViewController: UIViewController, UITextFieldDelegate
{
//MARK:- Outlets
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var phoneNumTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var conformPasswordTextField: UITextField!
@IBOutlet weak var otpTextField: UITextField!
@IBOutlet weak var registerButton: UIButton!
@IBOutlet weak var sendOtpButton: UIButton!
@IBOutlet weak var otpcountLabel: UILabel!
@IBOutlet weak var resendButn: UIButton!
var otpField: Int?
var otpTimer = Timer()
var totalTime = 10
override func viewDidLoad() {
super.viewDidLoad()
self.phoneNumTextField.keyboardType = .phonePad
otpTextField.isHidden = true
resendButn.isHidden = true
}
@IBAction func registerButton(_ sender: Any) {
if (nameTextField.text == "" || phoneNumTextField.text == "" || passwordTextField.text == "" || conformPasswordTextField.text == "")
{
registerButton.isHidden = false
sendOtpButton.isHidden = true
AlertFun.ShowAlert(title: "Title", message: "RequiredAllFields", in: self)
}
else{
registerButton.isHidden = true
sendOtpButton.isHidden = false
otpTextField.isHidden = false
resendButn.isHidden = false
DispatchQueue.main.async {
self.otpTextField.text = self.otpField as? String
}
registerService()
otpTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
}
}
@IBAction func sendOTPButton(_ sender: Any) {
otpService()
}
@IBAction func resendOtpButn(_ sender: Any) {
print("resendotp tapped")
otpTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
registerService()
}
@objc func update() {
if(totalTime > 0) {
totalTime = totalTime - 1
print(totalTime)
otpcountLabel.text = String(totalTime)
//resendButn.setTitle("\(totalTime) Resend Otp", for: .normal)
}
else {
//otpcountLabel.isHidden = true
otpTimer.invalidate()
print("call your api")
//registerService()
}
}
//MARK:- Service part
@objc func registerService(){
print("register tapped")
let parameters = ["mobile_number": Int(phoneNumTextField.text ?? "") as Any,
"email":emailTextField.text as Any,
"password":passwordTextField.text as Any,
"name": nameTextField.text as Any]
let url = URL(string: "https://dev.com/webservices/register")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
print("the json regggggggggggis \(json)")
self.otpField = json["otp"] as? Int
}catch{
print("error")
}
}
}).resume()
}
@objc func otpService(){
let parameters = ["mobile_number": phoneNumTextField.text as Any,
"otp": otpTextField.text as Any]
let url = URL(string: "https://dev.com/webservices//otpverify")
var req = URLRequest(url: url!)
req.httpMethod = "POST"
req.addValue("application/json", forHTTPHeaderField: "Contet-Type")
req.addValue("application/json", forHTTPHeaderField: "Accept")
guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {return}
req.httpBody = httpBody
let session = URLSession.shared
session.dataTask(with: req, completionHandler: {(data, response, error) in
if response != nil {
// print(response)
}
if let data = data {
do{
let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: Any]
print("the json of otppppppppp \(json)")
DispatchQueue.main.async {
if (self.otpTextField.text == String(self.otpField!)){
print("registration successfullllll...")
let loginVC = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.present(loginVC, animated: true)
}
else if self.otpTextField.text == ""{
AlertFun.ShowAlert(title: "", message: "Please enter OTP", in: self)
print("register fail")
}
else {
AlertFun.ShowAlert(title: "", message: "Invalid OTP", in: self)
print("register fail")
}
}
}catch{
print("error")
}
}
}).resume()
}
}
请在代码中帮助我。
解决方案
var count = 60 // 60sec if you want
var resendTimer = Timer()
在您的提交按钮上
@IBAction func sendOTPButton(_ sender: Any) {
resendTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
}
然后定时器功能
@objc func update() {
if(count > 0) {
count = count - 1
print(count)
btn.setTitle("\(count) Resend Otp", for: .normal)
}
else {
resendTimer.invalidate()
print("call your api")
// if you want to reset the time make count = 60 and resendTime.fire()
}
}
推荐阅读
- javascript - jQuery AJAX 调用将数据“d:null”附加到 Json 返回
- c - crypt 函数的不同输出
- php - 如何从具有不同 URL 的网页访问 cookie 信息
- css - SCSS 模块给出流量错误
- r - 条件面板未按预期显示,但出现警告消息
- mongodb - MongoError:包含 ObjectId 的唯一复合索引的 E11000 重复键错误集合
- mongodb - MongoDb - 查询 - 即使结果不为空也为空
- python - 难以弄清楚如何在单词之间实现空格。现在我有下划线
- sql - 如何计算 T-SQL 中事件之间的时间间隔
- python - 无法在 Spyder 3.2.4 中使用 Tkinter