Передайте UITextField (пароль) из VC1 и сравните (не совпадает) с UITextField (подтвердите пароль) на VC2 - PullRequest
0 голосов
/ 24 декабря 2018

ViewController2 " Введите пароль " UITextField значение должно быть передано ViewController3.

ViewController3 " Подтвердите пароль " *Значение 1011 * необходимо сравнить с ViewController2 " Введите пароль " UITextField, когда пользователь нажимает " Далее " UIButton.

Еслизначения разные, « пароли не совпадают » UILabel необходимо сделать видимыми над UITextField, а « Next » UIButton необходимо вернуться назадбыть неактивным.

На данный момент оба UITextFields имеют критерии, требующие минимум 6 символов, поэтому " Next " UIButton остается неактивным, пока критерии не будут выполнены.

ViewController2.swift :

import UIKit

class ViewController2: UIViewController, UITextFieldDelegate {

@IBOutlet weak var passwordField: UITextField!

@IBOutlet weak var toViewController3Button: UIButton!

@IBAction func backToViewController1(_ sender: Any) {
    print("back button pressed")
    self.performSegue(withIdentifier: "ViewController2ToViewController1Segue", sender: self)
}

@IBAction func toViewController3(_ sender: Any) {
    print("next button pressed")
    self.performSegue(withIdentifier: "ViewController2ToViewController3Segue", sender: self)
}

@IBAction func textFieldChangedValue(_ sender: UITextField) {
    toViewController3Button.isEnabled = sender.text!.count >= 6
}

override func viewDidLoad() {
    super.viewDidLoad()
    print("ViewController2 has loaded")
    // Is off until password criteria is satisfied
    toViewController3Button.isEnabled = false
    // Set delegate
    passwordField.delegate = self
    passwordField.becomeFirstResponder()
    passwordField.addTarget(self, action: #selector(textFieldChangedValue(_:)), for: .editingChanged)
}

// Hide keyboard when Return key is pressed
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    passwordField.resignFirstResponder()
    print("Keyboard Hidden by Return Key")
    return true
}

// Global: Hide Keyboard when screen is touched outside of text field
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
    print("Keyboard Hidden by Screen Tap")
}

// Confirm Password field must have 6 or more characters for Next -> button to activate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == passwordField {
        let countAfter = textField.text!.count + string.count - range.length
        toViewController3Button.isEnabled = countAfter >= 6
    }
    return true
}
}

ViewController3.swift:

import UIKit

class ViewController3: UIViewController, UITextFieldDelegate {

@IBOutlet weak var confirmPasswordField: UITextField!

@IBOutlet weak var toViewController4Button: UIButton!

@IBAction func backToViewController2(_ sender: Any) {
    print("back button pressed")
    self.performSegue(withIdentifier: "ViewController3ToViewController2Segue", sender: self)
}

@IBAction func toViewController4(_ sender: Any) {
    print("next button pressed")
    self.performSegue(withIdentifier: "ViewController3ToViewController4Segue", sender: self)
}

@IBAction func textFieldChangedValue(_ sender: UITextField) {
    toViewController4Button.isEnabled = sender.text!.count >= 6
}

override func viewDidLoad() {
    super.viewDidLoad()
    print("ViewController3 has loaded")
    // Is off until password criteria is satisfied
    toViewController4Button.isEnabled = false
    // Set delegate
    confirmPasswordField.delegate = self
    confirmPasswordField.becomeFirstResponder()
    confirmPasswordField.addTarget(self, action: #selector(textFieldChangedValue(_:)), for: .editingChanged)
}

// Hide keyboard when Return key is pressed
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    confirmPasswordField.resignFirstResponder()
    print("Keyboard Hidden by Return Key")
    return true
}

// Global: Hide Keyboard when screen is touched outside of text field
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
    print("Keyboard Hidden by Screen Tap")
}

// Confirm Password field must have 6 or more characters for Next -> button to activate
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == confirmPasswordField {
        let countAfter = textField.text!.count + string.count - range.length
        toViewController4Button.isEnabled = countAfter >= 6
    }
    return true
}
}

В качестве альтернативы, если значенияиз обоих UITextFields можно сравнивать на лету в реальном времени, так как пользователь вводит символы в " Подтвердить пароль " UITextField, тогда это тоже хорошо (вместо использования " Далее "UIButton, чтобы начать сравнение).

Я слишком неопытен, чтобы знать, какой маршрут является лучшим, поэтому любые другие советы, конечно, приветствуются.

Я смогпередать данные из VC1 в VC2 (как видно из приведенных ниже фрагментов кода), но не смог выяснить, как соединить остальную часть вместе.

ViewController1.swift:

import UIKit
class ViewController1: UIViewController {

@IBOutlet weak var passwordField: UITextField!

var passwordText = ""

override func viewDidLoad() {
    super.viewDidLoad()

}

@IBAction func done(_ sender: Any) {
    self.passwordText = passwordField.text!
    performSegue(withIdentifier: "ViewController1ToViewController2", sender: self)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    var vc = segue.destination as! ViewController2
    vc.passwordFieldValue = self.passwordText
}
}

ViewController2.swift:

import UIKit

class ViewController2: UIViewController {


@IBOutlet weak var passwordFieldValue: UILabel!

@IBOutlet weak var confirmPasswordField: UITextField!

var passwordFieldValue = ""

override func viewDidLoad() {
    super.viewDidLoad()

    passwordFieldValue.text = passwordFieldValue
}

@IBAction func backToViewController(_ sender: Any) {
    print("Back to ViewController")
    self.performSegue(withIdentifier: "ViewController2ToViewController1", sender: self)
}
}

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Не передавать UITextField на следующую ViewController.Вы можете передать textField.text себя.

Вы собираетесь сравнить две строки.Если его несоответствие, вы можете вернуться назад.

Итак, вы можете изменить наш код, например ViewController2

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

     let conformViewController = segue.destination as! ViewController3
     conformViewController.password = passwordTextField.text ?? ""
    }

В ViewController3

var password: String = ""

Тогда вы можете сравнить в ViewController3

let confirmPassword = confirmPasswordField.text ?? ""


if password == confirmPassword {
nextButton.isEnabled = true
} else {
label.text=“password mismatched”
}
0 голосов
/ 24 декабря 2018

Не проходите мимо UITextField.Подготовьте модель вместо этого.Я предполагаю, что вы пытаетесь реализовать поток регистрации.Поэтому создайте модель запроса на регистрацию следующим образом.

struct SignupRequestModel {
    var email: String? // guessing you are using email 
    var password: String?
    var confirmedPassword: String?
    // ... other fields, which you require to complete signup
}

Затем, когда вы обойдете UITextField, вместо этого передайте экземпляр SignupRequestModel, постепенно устанавливая все его свойства.

Надеюсь, вы поняли мою точку зрения.

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...