Swift 使用#selector 后按钮崩溃

Swift Button crashes after #selector is used

我已经设法使文本字段验证正常工作,除非文本框字段中有文本,否则不允许激活添加按钮。

但是,现在当我按下添加按钮时,应用程序崩溃了。

我做了一些研究,看起来是因为:

calarieSubmit.addTarget(自我,动作:#selector(calarieSubmitDidChange),用于:.editingChanged)

然后将代码放在内存中的其他位置,添加按钮无法访问。 如果我将#selector 代码移出已加载视图并移至控制器顶部,则看不到 calariesSubmitDidChange 文本框。

有谁知道需要将代码放在哪里才能阻止崩溃,或者我是否需要重写代码?

谢谢!

**更新 - 很抱歉没有将代码复制到这里,我现在已经在下面完成了:

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

 }   
}

我尝试了下面的所有方法,在函数前面添加了@objec,但没有成功。每次按下添加按钮时,应用程序都会崩溃。然而,数据仍然传递到数据库,然后在 UIAlertController 上崩溃。

添加

 @objc func calarieSubmitDidChange(_ sender:UITextField)

Swift 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
                }
            }

所以在所有这一切之后,事实证明应用程序崩溃是由于 rouge IBOutlet。删除后,该应用程序可以正常运行而不会崩溃。