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。删除后,该应用程序可以正常运行而不会崩溃。
我已经设法使文本字段验证正常工作,除非文本框字段中有文本,否则不允许激活添加按钮。
但是,现在当我按下添加按钮时,应用程序崩溃了。
我做了一些研究,看起来是因为:
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。删除后,该应用程序可以正常运行而不会崩溃。