- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建登录流程,并且正在重新使用我的文本字段。我想知道我在这方面做错了什么,或者如何更改文本字段的验证。我创建了一个计数器,看看这是否有助于确定在该计数上使用的选项。当我进行电子邮件验证时,它无法正常工作。无论我输入什么,我都会收到警报。
final class SignupViewController: UIViewController, ViewPassesData, UITextFieldDelegate {
@IBOutlet weak var firstNameTextField: UITextField!
@IBOutlet weak var lastNameTextField: UITextField!
@IBOutlet weak var backgroundViewImage: UIImageView!
@IBOutlet weak var firstLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
@IBOutlet weak var button: UIButton!
@IBOutlet weak var secondLine: UIView!
enum SignUpStage {
case name
case email
case password
case phone
case text
case notifications
case location
}
var stage: SignUpStage?
var dictionary: [String: String] = [:]
override func viewDidLoad() {
super.viewDidLoad()
setLayoutForStage()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
firstNameTextField.resignFirstResponder()
lastNameTextField.resignFirstResponder()
}
func isValidEmail(email:String) -> Bool {
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
let result = emailTest.evaluate(with: email)
return result
}
func isPasswordValid(text: String) -> Bool {
let passWordRegEx = "[A-Z0-9a-z]{0,9}"
let passwordTest = NSPredicate(format:"SELF MATCHES %@", passWordRegEx)
let result = passwordTest.evaluate(with: text)
return result
}
@IBAction func validationTextField(_ sender: UITextField) {
}
这就是我的代码遇到问题的地方。 - 更新我已经在 @Julio Cesar Arregoitía Val 评论的帮助下解决了这个问题。
@IBAction func actionButtonPressed(_ sender: UIButton) {
guard let vc = storyboard?.instantiateViewController(withIdentifier: "Signup") as? SignupViewController, let stage = nextStage() else { return }
vc.stage = stage
setDictionaryValues()
switch currentStage {
case .name:
if firstNameTextField.text == "" || lastNameTextField.text == "" {
alertMessage()
}
else {
vc.dictionary = dictionary
self.navigationController?.pushViewController(vc, animated: true)
}
case .email:
currentStage = .email
if isValidEmail(email: "\(firstNameTextField.text!)") == true {
vc.stage = stage
vc.dictionary = dictionary
self.navigationController?.pushViewController(vc, animated: true)
}
else {
alertMessage()
}
case .password:
currentStage = .password
if firstNameTextField.text != "" && isPasswordValid(text: "\(firstNameTextField.text!)") == true {
vc.stage = stage
vc.dictionary = dictionary
self.navigationController?.pushViewController(vc, animated: true)
}
else {
alertMessage()
}
case .phone:
currentStage = .phone
case .text:
currentStage = .text
case .notifications:
currentStage = .notifications
case .location:
currentStage = .location
}
}
@IBAction func back(_ sender: Any) {
navigationController?.popViewController(animated: true)
}
private func setLayoutForStage() {
guard let stage = stage else { return }
switch stage {
case .name:
firstLabel.text = "first name".uppercased()
secondLabel.text = "last name".uppercased()
case .email:
firstLabel.text = "email".uppercased()
secondLabel.isHidden = true
lastNameTextField.isHidden = true
secondLine.isHidden = true
case .password:
button.setNeedsDisplay()
firstLabel.text = "password".uppercased()
firstNameTextField.isSecureTextEntry = true
secondLabel.isHidden = true
lastNameTextField.isHidden = true
secondLine.isHidden = true
case .phone:
firstLabel.text = "phone number".uppercased()
firstNameTextField.keyboardType = .numberPad
secondLabel.isHidden = true
lastNameTextField.isHidden = true
secondLine.isHidden = true
case .text: break
case .notifications: break
case .location: break
}
}
func resetTextFields() {
}
func setDictionaryValues() {
guard let stage = stage else { return }
switch stage {
case .name:
dictionary["first_name"] = firstNameTextField.text?.capitalizingFirstLetter()
dictionary["last_name"] = lastNameTextField.text?.capitalizingFirstLetter()
case .email:
dictionary["email"] = firstNameTextField.text
firstNameTextField.text = ""
case .password:
dictionary["password"] = firstNameTextField.text
dictionary["password_confirmation"] = firstNameTextField.text
case .phone:
dictionary["phone_number"] = firstNameTextField.text
dictionary["contact_preference"] = "EMAIL"
case .text: break
case .notifications: break
case .location: break
}
}
// TODO: make this all one system
private func nextStage() -> SignUpStage? {
guard let stage = stage else { return .name }
switch stage {
case .name: return .email
case .email: return .password
case .password: return .phone
case .phone:
guard let nextVC = storyboard?.instantiateViewController(withIdentifier: "text") as? TextPhoneViewController, firstNameTextField.text?.count == 10 else {
return nil
}
nextVC.dictionary = dictionary
self.navigationController?.pushViewController(nextVC, animated: true)
return nil
case .text: return nil
case .notifications: return nil
case .location: return nil
}
}
}
最佳答案
1-我认为你的主要问题lem 是,在情况 0 中,i +=1
它仅放置在 else 中,并且当评估它时,您的 vc 由
self.navigationController?.pushViewController(vc, animated: true)
2-我认为您需要i
来了解您处于哪个阶段。为此使用枚举变量:
var currentStage: SignUpStage = .name
@IBAction func actionButtonPressed(_ sender: UIButton) {
switch currentStage {
case .name:
// Check name
// ...
// if it is ok
fallthrough
case .email:
currentStage = .email
// Check .email:
// ...
// if it is ok
fallthrough
case .password:
currentStage = .password
// All the others checks like this
}
fallthrough
让您仅在需要时才评估下一个条件,
3-您不需要输入:
lert.dismiss(animated: true, completion nil)
就这样做
lert.addAction( UIAlertAction(title: "OK", style: .default, handler: nil) )
你会得到相同的结果。
问候
关于ios - 重用 uitextfield 进行输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52022123/
我是一个为 iOS 设备开发的新手。我在 InterfaceBuilder 上插入了一个 UITextField,并分配了代码: @interface ComposeViewController :
我有两个要用于登录的 UITextFields,一个用于用户名,一个用于密码。在我无法关闭第一个 UITextField 中的键盘之前,但我设法解决了这个问题,现在的问题是,一旦它关闭,我就无法单击另
在 tvOS 中编辑 UITextField 会显示一个新 View ,用户可以在其中输入文本,文本输入完成后,用户将返回到之前的 View 。但是,我发现当我从文本编辑器返回时,我编辑的文本没有显示
我在同一个 ViewController 上有三个 UITextfields(customerRequestTextField 、 fundsAvailableTextField 和 amountOw
我有一个要求,需要将内容从一个 UITextField 复制到同一屏幕上的另一个 UITextField 中。它就像一个别名,一旦用户开始输入,我就应该开始复制内容。我正在使用方法 (BOOL)tex
我有一个 ViewController、许多 UITextField(一个在另一个下面)和第一个 UITextField 右边的按钮。 按下按钮时,我希望在此下方显示另一个 UITextField(每
我有 3 个 UITextField(位置、地址、 zip )。我在 viewDidLoad 中隐藏了 2 个字段。 Addres1.hidden = YES; Zip1.hidden = YES;
在 Swift 中,我有一个 UITextField、textA 和一个 UITextField、textB。 textA 有时会被禁用,但 textB 始终启用。 textA 被禁用: textA.
我有 2 个 UITextFields。一个是美元,另一个是瑞尔。当我输入 textfield$ 时,我想自动查看 textfieldRiel 中的值。怎么做 ? 最佳答案 实现 uitextfiel
我想将一个 UITextField 属性转移到另一个 UITextField。我该怎么做? 这是我的完整场景: 我创建了一个自定义单元格,其中有一个 UITextField。 现在,当我在我的 UIT
我有一个 UITextField,我想将其长度限制为 4 个字符,这是它的代码: func textField(textField: UITextField, shouldChangeCharacte
@IBOutlet weak var labelLabel: UILabel @IBOutlet weak var textFieldField: UITextField @IBAction func
我在 xib 中定义了一个 UITableViewCell。这个 UITableViewCell 有一个 UITextField,叫做 itemText。此 UITableViewCell 也采用其他
我们的应用程序有几个 UITextField,用户可以在其中输入字母数字输入代码,例如“AA149873A”。 我们希望画外音将这些读为“A A 1 4 9 8 7 2 A”,但它却将数字读为数字:“
在我的 iOS 应用程序中,我有一个文本字段,其中有一个分配给它的 inputView 的选择器 View 。在 iOS 设备上,每当用户点击文本字段时,选择器 View 就会弹出。但是,当我将它作为
在 iOS 13 中,访问 UITextField 时发生崩溃_placeholderLabel.textColor 标签键。 用于应用占位符文本颜色的键。 [textfield setValue:[
我想复制iMessage结构的效果,点击工具栏中的UITextView,键盘就会出现。但我不知道如何在打字时显示文本。我认为当键盘出现时我应该将 UITextField 向上移动 class View
我有两个 UITextField,cDiseasePicker 和 optionalLMS。 我的cDiseasePicker使用UIPickerView作为输入,选项为“否”、“是,1VD”、“是,
当点击某个 CA 层时,我动态创建了两个 UITextField。我已将第一个文本字段设为第一响应者,我想要的是,当我在第一个文本字段中输入文本并按完成时,我希望第二个文本字段成为第一响应者。这就是我
我正在寻找 UITextField 的方法,它在我输入 UITextField 后产生效果。 我有一个方法来进行计算我使用一个按钮,但我不想使用,我希望你在我在 UITextField 中输入数字后运
我是一名优秀的程序员,十分优秀!