Кнопка Swift аварийно завершает работу после использования #selector - PullRequest
0 голосов
/ 02 апреля 2020

Мне удалось запустить проверку текстового поля, которая не позволяет активировать кнопку добавления, если в текстовом поле нет текста.

Однако теперь, когда я нажимаю кнопку добавления, приложение вылетает.

Я провел некоторое исследование, и похоже, что оно из-за:

calarieSubmit.addTarget (self , action: #selector (calarieSubmitDidChange), для: .editingChanged)

, который затем помещает код в другое место в памяти и недоступен для кнопки добавления. Если я переместлю код #selector из загруженного представления в верхнюю часть контроллера, текстовое поле calariesSubmitDidChange не отобразится.

enter image description here

enter image description here

Кто-нибудь знает, где нужно разместить код, чтобы остановить сбой, или мне нужно переписать код?

Спасибо!

** Обновление - извините, что не скопировал код в это, я сделал это ниже:

import UIKit
import Firebase

class ItemToAddViewController: UIViewController {    
var finalName = ""

override func viewDidLoad() {
    super.viewDidLoad()

    addButton.isEnabled = false

    show.text = "\(finalName)"

    calarieSubmit.addTarget(self, action: #selector(calarieSubmitDidChange), for: .editingChanged)

}

@IBOutlet weak var button: UIButton!

@IBOutlet weak var show: UILabel!

@IBOutlet weak var calarieSubmit: UITextField!

@IBAction func calarieSubmitDidChange(_ sender: Any) {

    //Validate Input Button

   // print("\(calarieSubmit.text!)")

    if calarieSubmit.text!.isEmpty {
       addButton.isEnabled = false
    } else {
        addButton.isEnabled = true
    }

    }


@IBOutlet weak var addButton: UIButton!

    @IBAction func addButton(_ sender: Any) {

    let input = calarieSubmit.text

    //Send New Item to Database

    var ref: DatabaseReference!
    ref = Database.database().reference()

    ref.child("items").updateChildValues((["\(finalName)": "\(input!)"]))

    let alert = UIAlertController(title: "Added!", message: "Item now added!", preferredStyle: .alert)
         alert.addAction(UIAlertAction(title: NSLocalizedString("Return", comment: "Default action"), style: .default, handler: { (action) -> Void in
            _ = self.navigationController?.popViewController(animated: true)

           }))

           self.present(alert, animated: true, completion: nil)




    //Move in once added or show error

 }   
}

Я попробовал все ниже с добавлением @ obje c перед функцией, но нет удачи. Приложение вылетает при каждом нажатии кнопки добавления. Однако данные по-прежнему передаются в базу данных, а затем происходит сбой на UIAlertController.

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Свифт 4.2

textfield.addTarget(self, action: #selector(ViewControllerr.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)



@objc func textFieldDidChange(_ textField: UITextField) {
                if txtfield.text != nil {
                    button enable
                } else {
                    button false
                }
            }
0 голосов
/ 12 апреля 2020

Итак, после всего этого оказывается, что приложение зависало из-за румянца IBOutlet. После удаления приложение работало без сбоев.

0 голосов
/ 02 апреля 2020

Добавить

 @objc func calarieSubmitDidChange(_ sender:UITextField)
...