Swift 已将无法识别的选择器发送到实例0x7feb26814010';
我已经使用SQLite创建了一个单例类数据库,但是,当我试图从另一个视图控制器调用函数时,它会崩溃。运行到函数中的值是来自故事板两个文本字段的即时变量。在我将数据库代码放入viewcontroller类之前,尽管它会给出nil返回和崩溃,但我被告知将数据库代码放入另一个swift文件中,并使其成为单例Swift 已将无法识别的选择器发送到实例0x7feb26814010';,swift,database,xcode,sqlite,Swift,Database,Xcode,Sqlite,我已经使用SQLite创建了一个单例类数据库,但是,当我试图从另一个视图控制器调用函数时,它会崩溃。运行到函数中的值是来自故事板两个文本字段的即时变量。在我将数据库代码放入viewcontroller类之前,尽管它会给出nil返回和崩溃,但我被告知将数据库代码放入另一个swift文件中,并使其成为单例 // // DB.swift // IA // // Created by Ian Dong on 10/21/20. // Copyright © 2020 Ian Dong. All
//
// DB.swift
// IA
//
// Created by Ian Dong on 10/21/20.
// Copyright © 2020 Ian Dong. All rights reserved.
//
import Foundation
import SQLite
struct DB {
public var database: Connection!
let ingTable = Table("ingerdients")
let iName = Expression<String>("ingerdientName")
let iAmount = Expression<Double>("ingerdientAmount")
private init(){
do{
let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
let fileUrl = documentDirectory.appendingPathComponent("ingerdients").appendingPathExtension("sqlite3")
let database = try Connection(fileUrl.path)
self.database = database
}
catch {
print("error")
}
print("waiting to create table")
let createTable = self.ingTable.create { (table) in
table.column(self.iName, unique: true)
table.column(self.iAmount)
}
do{
try self.database.run(createTable)
print("Table has been created")
}
catch{
print(error)
}
}
static let shared = DB()
func addIngerdient( sName: String, ingAmount: Double)
{
let newIngerident = Ingerdient(Name: sName, Amount: ingAmount)
let insertIngerdient = self.ingTable.insert(self.iName <- sName, self.iAmount <- ingAmount)
do{
try self.database.run(insertIngerdient)
print("Ingerdient ", sName, " Inserted")
}
catch{
print(error)
print("unable to insertIngerdient")
}
}
func listIngerdient()
{
do{
let ingerdients = try self.database.prepare(self.ingTable)
for ingerdient in ingerdients{
print(" ingerdientName: \(ingerdient[self.iName]), ingerdientAmount: \(ingerdient[self.iAmount])")
}
}
catch
{
print(error)
}
}
}
完整的错误信息是什么?因为它通常会给出很好的提示。哪一行导致崩溃?-[IA.AddIngerdient AddIngerdient:]:发送到实例0x7feb26814010'的选择器无法识别。这是完整消息,消息显示在AppDelegateYou中您有一个名为
AddIngerdient
的类?它使用一个参数调用一个方法addIngerdient:
。从哪里来?这是重要的代码。
//
// AddIngerdient.swift
// IA
//
// Created by Ian Dong on 9/9/20.
// Copyright © 2020 Ian Dong. All rights reserved.
//
import UIKit
import SQLite
class AddIngerdient: UIViewController, UITextFieldDelegate
{
@IBOutlet var DoneBut : UIButton!
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var amountField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapRecognizer = UITapGestureRecognizer()
tapRecognizer.addTarget(self, action: #selector(AddIngerdient.didTapView))
self.view.addGestureRecognizer(tapRecognizer)
}
@objc func didTapView(){
self.view.endEditing(true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textField.text == nil
{
textField.text == "0"
}
textField.resignFirstResponder()
return true
}
@IBAction func AddIng(_ sender: Any) {
var name: String
var amount: Double
do{
let sName: String = self.nameField.text ?? "name"
name = sName
print(name)
let sAmount: String = self.amountField.text ?? "0.0"
amount = Double(sAmount) ?? 0.0
print(sAmount)
DB.shared.addIngerdient(sName:name, ingAmount:amount)
print("a new ingeridient is added")
}
catch{
print(error)
}
}
}