Ios TextField是电话号码还是电子邮件格式?

Ios TextField是电话号码还是电子邮件格式?,ios,swift,validation,Ios,Swift,Validation,我有一个忘记密码的文本字段,在这里用户输入手机号码或电子邮件,然后我们发送OTP到那个 我试图用我的代码验证该文本字段,但它不起作用,任何人都可以给出一些想法,请用下面的代码查找我的代码 extension String { func isValidEmail() -> Bool { // here, `try!` will always succeed because the pattern is valid let regex = try! NS

我有一个忘记密码的文本字段,在这里用户输入手机号码或电子邮件,然后我们发送OTP到那个

我试图用我的代码验证该文本字段,但它不起作用,任何人都可以给出一些想法,请用下面的代码查找我的代码

extension String {
    func isValidEmail() -> Bool {
        // here, `try!` will always succeed because the pattern is valid
        let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
        return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
    }

    // vrify Valid PhoneNumber or Not
    func isValidPhone() -> Bool {

        let phoneRegex = "^[0-9]{10}$";
        let valid = NSPredicate(format: "SELF MATCHES %@", phoneRegex).evaluate(with: phoneRegex)
        return valid
    }
}
它需要对mailid或电话号码格式有效

if emaiTF.text == "" {
            print("Enter either valid phone or email")
        }else if let validphone = emaiTF.text, validphone.isValidPhone() || validphone.isValidEmail() {
            print("Enter either valid phone or email")
        }else{
            forGotPasswordApi()
        }
我的验证方法如下

extension String {
    func isValidEmail() -> Bool {
        // here, `try!` will always succeed because the pattern is valid
        let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive)
        return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
    }

    // vrify Valid PhoneNumber or Not
    func isValidPhone() -> Bool {

        let phoneRegex = "^[0-9]{10}$";
        let valid = NSPredicate(format: "SELF MATCHES %@", phoneRegex).evaluate(with: phoneRegex)
        return valid
    }
}

电话号码验证

 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let aSet = NSCharacterSet(charactersIn:"0123456789").inverted

    let compSepByCharInSet = string.components(separatedBy: aSet)

    let numberFiltered = compSepByCharInSet.joined(separator: "")

    guard let text = textField.text else { return true }

    let count = text.count + string.count - range.length

    return string == numberFiltered && count <= 10

  }
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
设aSet=NSCharacterSet(charactersIn:“0123456789”)。反转
让compSepByCharInSet=string.components(separatedBy:aSet)
让numberFiltered=compSepByCharInSet.joined(分隔符:“”)
guard let text=textField.text else{return true}
让计数=text.count+string.count-range.length

return string==numberFiltered&&count这似乎是您的输出验证中的问题。请按照以下方式修改代码以使其正常工作,请验证

  extension ViewController {

    func checkValidation() {
      if txtUserName.text == "" {
          print("Enter either valid phone or email 1")
      } else if let validphone = txtUserName.text, validphone.isValidPhone() || validphone.isValidEmail() {
          print("Success")
          forGotPasswordApi()
      }else{
        print("Enter either valid phone or email 2")
      }
    }
  }

  extension String {
      func isValidEmail() -> Bool {
          // here, `try!` will always succeed because the pattern is valid
          let regex = try! NSRegularExpression(pattern: "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,3})$", options: .caseInsensitive)
        let valid = regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
        print("Email validation \(valid)")
          return valid
      }

      // vrify Valid PhoneNumber or Not
      func isValidPhone() -> Bool {

        let regex = try! NSRegularExpression(pattern: "^[0-9]\\d{9}$", options: .caseInsensitive)
        let valid = regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil
        print("Mobile validation \(valid)")
          return valid
      }
  }
电子邮件验证

用下面的方法传递字符串

下面的方法将返回Bool值YES或NO

方法:

 func isValidEmail(testStr:String) -> Bool {
    // print("validate calendar: \(testStr)")
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"

    let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: testStr)
}
用法:

if isValidEmail(testStr: emailTxtFld.text!) == True {

       print("Valid");        
 }
else {

    print("In Valid");
 }

我通过更改验证检查更新了您提供的代码。我认为
validInput.isValidPhone()| | validInput.isValidEmail()
在您的代码中处理不正确

// Check if any input is entered and not empty string
guard let validInput = emaiTF.text, validInput != "" else {
  print("Enter either valid phone or email")
  return
}

// Check if entered value is valid or not
if validInput.isValidPhone() || validInput.isValidEmail() { 
  forGotPasswordApi()
} else {
  print("Enter either valid phone or email")
}
我的确认是:

extension String {

var isValidEmail: Bool {
    return NSPredicate(format: "SELF MATCHES %@", "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,3}").evaluate(with: self)
}
 var numberValidation: Bool {
    return NSPredicate(format: "SELF MATCHES %@", "^(?=.*[0-9]).{10}$").evaluate(with: self)
  }
}
我的代码用于检查给定输入

if mailTextField.text!.isValidEmail {
        print("u have entered correct mail format")
    }
if phonenumber.text!.numberValidation {
 print("mobile number in correct format")
}

OP对电话号码或电子邮件使用相同的字段。您不能简单地从文本字段内容中丢弃任何非数字。顺便说一句,您为什么不简单地筛选您不需要的字符?
string.filter{“0”…“9”~=$0}
另一点是
连接(分隔符:“”
没有意义,只需使用
连接()
UITextField
text属性永远不会返回
nil
。它的默认值是空字符串。您的守卫永远不会进入闭包。
UITextField
text属性永远不会返回
nil
。它的默认值是空字符串。顺便说一句,您可以简单地使用名为
uikeyinport
的属性
hasText
检查字段是否为空或not@LeoDabus我只想添加与提问者相同的检查。
guard emaiTF.hasText else{
if emaiTF.text!.isValidPhone()| | emaiTF.text!.isValidEmail(){
isValidEmail方法接受一个非可选字符串。调用该方法时需要打开字符串
emailTxtFld.text
。顺便说一句
==true
是多余的。
如果isValidEmail(testStr:emailTxtFld.text!){
添加2个答案的原因是什么?您可以更新以前添加的答案。
True
它不是一个类型。再次
==True
是冗余的。您甚至没有检查字符串是否是有效的电话号码。我没有明白您的意思。您能再次清楚地告诉我(作为新的投稿人),如果你不是指?如果你没有得到答案,为什么还要编辑答案并添加电话号码条件?顺便说一句,我已经在其他帖子上发表了评论。UITextField text属性永远不会返回nil。它的默认值是一个空字符串。如果mailTextField.text!.isValidEmail,你只需强制展开它的结果
{
当然,谢谢你对我的评论做出的宝贵贡献。
==true
是多余的。如果你的字符串不再是可选的,你可以省略它。我已经在下面的答案中修改并添加了你的代码补丁。请检查它是否对你有效,然后接受它,这样其他人可以从中受益!!