تعطيل الزر إذا كان TextField فارغًا

0

أحتاج إلى تعطيل الزر إذا كان TextField فارغًا. وإلا فإنه يعطل تطبيقي

(Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value).

أعلم أن الناس هنا كتبوا عنه عدة مرات. ولكن جربت العديد من الأمثلة من StackOverflow مثل:

if (MyTextField.text?.isEmpty)! {
MyButton.isEnabled = false
MyButton.alpha = 0.5
}

فوق الشفرة ، قمت بوضع viewDidLoad ولم يعمل. إذا وضعت لزر مثل:

@IBAction func acceptButton(_ sender: Any) {
if (MyTextField.text?.isEmpty)! {
MyButton.isEnabled = false
MyButton.alpha = 0.5
...

ثم زر تعطيل دائما. حتى أضع بعض الأرقام في TextField.

الرمز أدناه لا يعمل أيضًا:

override func viewDidLoad() {
        super.viewDidLoad()
MyTextField.addTarget(self, action: #selector(actionTextFieldIsEditingChanged), for: UIControlEvents.editingChanged)
...
}
...
 @objc func actionTextFieldIsEditingChanged(sender: UITextField) {
        if sender.MyTextField.isEmpty {
            MyButton.isEnabled = false
            MyButton.alpha = 0.5
        } else {
            MyButton.isEnabled = true
            MyButton.alpha = 1.0
        }
 }

لا يمكنني استخدام جزء آخر من الرموز لأنه من عام 2014-2015.

5 الردود

1
افضل جواب

المجموعة الأولى

override func viewDidLoad()
{
    super.viewDidLoad()
    btn.isEnabled = false
}

ثم في طريقة مندوب textfield

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    print(textField.text?.count ?? "default")
    if textField == MyTextField
    {
    if MyTextField.text?.count == 1 && string == ""
            {
                MyButton.isEnabled = false
            }
            else
            {
                MyButton.isEnabled = true
            }
    }
    return true
}
:مؤلف
1
افضل جواب

تحتاج إلى تنفيذ UITextFieldDelegate طريقة لتمكين الزر عندما يكون هناك نص في النص المقدم.

class ViewController: UIViewController { 

   override func viewDidLoad() {
    super.viewDidLoad()

       myTextField.delegate = self
   }

}

تطبيق طريقة التفويض هذه ...

extension ViewController: UITextFieldDelegate { 


  func textFieldDidEndEditing(_ textField: UITextField) {

    if let text = textField.text, text.isEmpty {
        MyButton.isUserInteractionEnabled = false
        MyButton.isEnabled = false
        MyButton.alpha = 0.5
    } else {
       MyButton.isUserInteractionEnabled = true
        MyButton.isEnabled = true
        MyButton.alpha = 1
   }

  }

}

يمكنك تعطيل الزر في طريقة viewDidLoad أيضًا.

if let text = MyTextField.text, text.isEmpty {
    MyButton.isUserInteractionEnabled = false
    MyButton.isEnabled = false
    MyButton.alpha = 0.5
} 

تعديل

يمكنك أيضًا تمكين الزر وتعطيله لأنواع المستخدمين في حقل النص.

extension ViewController: UITextFieldDelegate {  

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

    let text = (textField.text! as NSString).replacingCharacters(in: range, with: string)

    if text.isEmpty{

        MyButton.isUserInteractionEnabled = false
        MyButton.isEnabled = false
        MyButton.alpha = 0.5

    } else {

        MyButton.isUserInteractionEnabled = true
        MyButton.isEnabled = true
        MyButton.alpha = 1
   }

    return true
  }
}
:مؤلف
0

لا أرى إجابة كاملة على ذلك ، لذلك هنا:

  1. لدى iOS اصطلاح قوي بأن الأسماء المتغيرة وأسماء الوظائف يجب أن تبدأ بحرف صغير. يجب أن تبدأ الصفوف والأنواع فقط بأحرف كبيرة. وهكذا في الكود أدناه قمت بتغيير MyButton إلى myButton و MyTextField إلى myTextField .
  2. لا تستخدم isUserInteractionEnabled و alpha . فقط قم بتعيين الزر isEnabled الإبلاغ والسماح لـ UIKit بتحديد كيفية رسم الزر المعطل. بهذه الطريقة يمكنك اتباع اصطلاحات HIG العادية لإظهار زر معطل.
  3. أضف كود إلى الخاص بك viewWillAppear(_:) وظيفة لتعطيل الزر إذا كان حقل النص فارغًا.

مثله:

override func viewWillAppear(_ animated: Bool) {
    myButton.isEnabled = (myTextField.text?.count ?? 0) > 0
}
  1. جعل تحكم العرض الخاص بك تتوافق مع UITextFieldDelegate بروتوكول. ثم اسحب التحكم من حقل النص إلى وحدة التحكم في العرض لتوصيل رابط المفوض.

  2. أضف textField(_:shouldChangeCharactersIn:replacementString:) وظيفة لجهاز التحكم في العرض الخاص بك لتعطيل الزر إذا كان حقل النص فارغًا. لاحظ أن هذه الوظيفة يجب أن تكتشف ما إذا كان حقل النص سيكون فارغًا بعد اكتمال الاستبدال ، لذلك تحتاج إلى حساب طول نص الحقل بعد استبدال السلسلة. يمكنك إضافة UITextFieldDelegate وظائف في امتداد للتحكم في العرض الخاص بك ، والذي يفصل بينها بشكل جيد.

مثله:

extension ViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField, 
      shouldChangeCharactersIn range: NSRange, 
      replacementString string: String) -> Bool {
        //Make sure this method is being called
        guard textField == myTextField else { return true }
        let newLength = (textField.text?.count ?? 0) - range.length + string.count
        myButton.isEnabled = newLength > 0
        return true
    }
}
:مؤلف
0
@IBAction func acceptButton(_ sender: Any) {
  if (MyTextField.text?.isEmpty)! {
    print("i am not doing anything")
   }
  else{
      //perform the code
  }
 }
:مؤلف
0

استعمال UITextFieldDelegate طريقة shouldChangeCharactersIn لهذا.

أولا ربط صفك مع UITextFieldDelegate مثله

class ClassName: UIViewController, UITextFieldDelegate { ...

ثم أضف هذا الرمز إلى حسابك viewDidLoad

myTextField?.delegate = self
MyButton?.isUserInteractionEnabled = false
MyButton?.alpha = 0.5

وتنفيذ طريقة المندوب هذه

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

        let text = (textField.text! as NSString).replacingCharacters(in: range, with: string)

        if !text.isEmpty{
            MyButton?.isUserInteractionEnabled = true
            MyButton?.alpha = 1.0
        } else {
            MyButton?.isUserInteractionEnabled = false
            MyButton?.alpha = 0.5
        }
        return true
    }
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام