#ios #swift #iphone
#iOS #swift #iPhone
Вопрос:
В моем приложении есть 3 UITextFields, и мне нужно, чтобы пользователь заполнил их, прежде чем он / она сможет увидеть UIButton, который будет вычислять результат. Я перепробовал много разных методов для решения проблемы, но они, похоже, не работают, и я не совсем понимаю некоторые из них. Я уверен, что есть простой способ сделать это. P.S.: Я не использую раскадровку
Я уже пытался включить UITextFieldDelegate, затем написал функцию, также использовал другие способы и т.д…
import UIKit
let Label: UILabel = {
let f = UILabel()
f.text = "Label"
return f
}()
let textFiled1: UITextField = {
let fw = UITextField()
fw.keyboardType = UIKeyboardType.decimalPad
return fw
}()
let textField2: UITextField = {
let fh = UITextField()
fh.keyboardType = UIKeyboardType.decimalPad
return fh
}()
let textField3: UITextField = {
let fa = UITextField()
fa.keyboardType = UIKeyboardType.numberPad
return fa
}()
class ViewController: UIViewController {
let calculateButton: UIButton = {
let c = UIButton()
c.setTitle("Calculate", for: .normal)
return c
}()
override func viewDidLoad() {
super.viewDidLoad()
setupLabel()
setupTextFieldComponents()
setupCalculateButton()
}
fileprivate func setupLabel() {
view.addSubview(fLabel)
}
fileprivate func setupTextFieldComponents() {
setupTextField1()
setupTextField2()
setupTexrField3()
}
fileprivate func setupTextField1() {
view.addSubview(textField1)
}
fileprivate func setupTextField2() {
view.addSubview(textField2)
}
fileprivate func setupTextField3() {
view.addSubview(textField3)
}
fileprivate func setupCalculateButton() {
view.addSubview(calculateButton)
}
@objc func calculateButtonPressed(sender: UIButton){
let textfield1 = Float(textField1.text!)
let textfield2 = Float(textField2.text!)
let textfield3 = Float(textField3.text!)
femaleMetaLabel.text = String(111 (1.1 * textfield1!) (1.1 * textfield2!) - (1.1 * textfield3!))
}
}
Предполагается, что пользователь вводит числовые данные во все три текстовых поля, чтобы вычислить результат. Есть ли способ вывести сообщение об ошибке без сбоя приложения?
Комментарии:
1. Наш код представляет собой полный беспорядок. Можете ли вы отредактировать его, чтобы сделать его читаемым?
Ответ №1:
Когда я выполняю проверку ввода текста, который активирует кнопку, я обычно делаю что-то вроде этого:
@IBOutlet weak var usernameField: UITextField!
@IBOutlet weak var passwordField: UITextField!
@IBOutlet weak var submitButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
submitButton.isEnabled = false
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self,
selector: #selector(validateInput(_:)),
name: UITextField.textDidChangeNotification,
object: usernameField)
NotificationCenter.default.addObserver(self,
selector: #selector(validateInput(_:)),
name: UITextField.textDidChangeNotification,
object: passwordField)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
@objc func validateInput(_ sender: Any?) {
submitButton.isEnabled = false
if let username = usernameField.text,
let password = passwordField.text {
// your validation rules will be more complex than this :D
if username.count > 0 amp;amp; password.count > 0 {
submitButton.isEnabled = true
}
}
}
Если все, что вам нужно сделать, это вывести предупреждение о неправильных вводимых данных, просто замените вызов метода, подобного приведенному ниже, где вы подтверждаете вводимые пользователем данные.
func showAlert() {
let alert = UIAlertController(title: "Nope",
message: "Your inputs were incorrect.",
preferredStyle: .alert)
alert.addAction( UIAlertAction(title: "Try again",
style: .default,
handler: nil) )
self.present(alert, animated: true, completion: nil)
}
Ответ №2:
@Maxim вы почти на месте. Позвольте мне добавить простой делегат в ваш код для достижения вашей цели.
Добавьте код в свой textFieldDidEndEditing
делегат —
func textFieldDidEndEditing(textField: UITextField) {
if (textField1.text?.count)! > 0 amp;amp; (textField2.text?.count)! > 0 amp;amp; (textField3.text?.count)! > 0 {
calculateButton.isEnabled = true
}else{
calculateButton.isEnabled = false
}
}
Теперь время для вычисления результата:
@objc func calculateButtonPressed(sender: UIButton){
if let inputOne = Float(textField1.text!), let inputTwo = Float(textField2.text!), let inputThree = Float(textField3.text!) {
femaleMetaLabel.text = String(111 (1.1*inputOne) (1.1*inputTwo)-(1.1*inputThree))
}else{
let alert = UIAlertController(title: "", message: "You entered invalid inputs", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
self.present(alert, animated: true)
}
}
Надеюсь, это вам поможет. Дайте мне знать, если у вас все еще возникают какие-либо проблемы.