ios - 如何在 mvvm 中验证表单的电子邮件
问题描述
我需要检查用户名、联系电话和电子邮件 ID 的验证。我正在 mvvm 中做。
为了那个原因
我的模型:-
class CF_Page1Model: NSObject {
var name:String!
var contactno:String!
var emailid:String!
init?(dictionary :JSONDictionary) {
guard
let name = dictionary["name"] as? String,
let contactno = dictionary["contactno"] as? String,
let emailid = dictionary["emailid"] as? String
else {
return
}
self.name = name
self.contactno = contactno
self.emailid = emailid
}
}
我的数据源模型:-
class CF_Page1DataSourceModel: NSObject {
var dataListArray:Array<CF_Page1Model>? = []
init(array :Array<[String:Any]>?) {
super.init()
var newArray:Array<[String:Any]> = []
if array == nil{
}
else{
newArray = array!
}
var datalist:Array<CF_Page1Model> = []
for dict in newArray{
let model = CF_Page1Model(dictionary: dict)
datalist.append(model!)
}
self.dataListArray = datalist
}
}
我的视图模型:-
class CF_Page1ViewModel: NSObject {
var datasourceModel:CF_Page1DataSourceModel
var emailid:Bool?
var phonenumber:Bool?
var nameofperson:Bool?
var name:String?
var age:Int?
var contactno:String?
var email:String?
var gender:String?
init(withdatasource newDatasourceModel:CF_Page1DataSourceModel) {
datasourceModel = newDatasourceModel
print(datasourceModel.dataListArray)
}
func isValidEmail(testStr:String)->Bool{
print("validate emilId: \(testStr)")
let emailRegEx = "^(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?(?:(?:(?:[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+(?:\\.[-A-Za-z0-9!#$%&’*+/=?^_'{|}~]+)*)|(?:\"(?:(?:(?:(?: )*(?:(?:[!#-Z^-~]|\\[|\\])|(?:\\\\(?:\\t|[ -~]))))+(?: )*)|(?: )+)\"))(?:@)(?:(?:(?:[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])?)*)|(?:\\[(?:(?:(?:(?:(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))\\.){3}(?:[0-9]|(?:[1-9][0-9])|(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5]))))|(?:(?:(?: )*[!-Z^-~])*(?: )*)|(?:[Vv][0-9A-Fa-f]+\\.[-A-Za-z0-9._~!$&'()*+,;=:]+))\\])))(?:(?:(?:(?: )*(?:(?:(?:\\t| )*\\r\\n)?(?:\\t| )+))+(?: )*)|(?: )+)?$"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let result = emailTest.evaluate(with: testStr)
print(result)
emailid = result
return emailTest.evaluate(with: testStr)
}
func validate(value: String){
let PHONE_REGEX = "[235689][0-9]{6}([0-9]{3})?"
let phoneTest = NSPredicate(format: "SELF MATCHES %@", PHONE_REGEX)
let result1 = phoneTest.evaluate(with: value)
print(result1)
// phoneTest = result
phonenumber = result1
}
func isValidInput(Input:String) {
let RegEx = "\\A\\w{7,18}\\z"
let Test = NSPredicate(format:"SELF MATCHES %@", RegEx)
let username = Test.evaluate(with: Input)
print(username)
nameofperson = username
print(nameofperson)
}
}
和视图控制器:-
在那个提交按钮中: -
@IBAction func forward(_ sender: AnyObject) {
self.page1ViewModel.name = nametext.text
self.page1ViewModel.contactno = contactnotext.text
self.page1ViewModel.email = emailidtext.text
self.page1ViewModel.isValidInput(Input: self.page1ViewModel.name!)
self.page1ViewModel.validate(value: self.page1ViewModel.contactno!)
self.page1ViewModel.isValidEmail(testStr: self.page1ViewModel.email!)
page1ViewModel.loadFromWebserviceData()
}
在视图控制器中
按钮动作:-
@IBAction func forward(_ sender: AnyObject) {
self.page1ViewModel.name = nametext.text
self.page1ViewModel.contactno = contactnotext.text
self.page1ViewModel.email = emailidtext.text
self.page1ViewModel.isValidInput(Input: self.page1ViewModel.name!)
self.page1ViewModel.validate(value: self.page1ViewModel.contactno!)
self.page1ViewModel.isValidEmail(testStr: self.page1ViewModel.email!)
page1ViewModel.loadFromWebserviceData()
}
这里的名称,联系人编号,电子邮件ID是文本字段,我使用了post方法。但是在提交按钮上我需要验证名称文本,联系人文本和电子邮件ID文本。如何在mvvm中做。模型中需要做哪些更改。?
解决方案
验证逻辑将进入 viewmodel 类。
从操作中删除以下代码:
self.page1ViewModel.isValidInput(Input: self.page1ViewModel.name!)
self.page1ViewModel.validate(value: self.page1ViewModel.contactno!)
self.page1ViewModel.isValidEmail(testStr: self.page1ViewModel.email!)
page1ViewModel.loadFromWebserviceData()
编写另一个方法来验证 viewmodel 中的所有字段,这将返回 bool:
func validateEntries() -> Bool {
guard let name = self.name else {
return false
}
guard let contactno = self.contactno else {
return false
}
guard let email = self.email else {
return false
}
let nameValid = self.isValidInput(Input: name)
let contactnoValid = self.validate(value: contactno)
let isEmailValid = self.isValidEmail(testStr: email)
return nameValid && contactNoValid && isEmailValid
}
在视图控制器中:实际上,如果它返回 true,则调用此函数,然后触发 api 调用,否则相应地显示任何验证消息。
希望能帮助到你...
推荐阅读
- javascript - HighCharts - 如何将最大值设置为 100%
- typescript - 将 Moment.js 与 React Native Typescript 一起使用
- python - 绘图不会随着下拉选择而改变
- windows - windows上docker中的wget失败
- json - 如何使用 RESTful 调用将项目添加到数组中?
- xml - XPATH 指令
- nginx - Nginx - 如何使用旧域的模式进行完整的 url 重定向
- django - 我的现场 Django 网站运行良好,但我的本地存储库已损坏
- ruby-on-rails - 从 id 或其他唯一字段获取 Rails 资源的正确方法?
- mysql - 在其他两个日期 SQL 之间选择一个随机日期