Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 已将无法识别的选择器发送到实例0x7feb26814010';_Swift_Database_Xcode_Sqlite - Fatal编程技术网

Swift 已将无法识别的选择器发送到实例0x7feb26814010';

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

我已经使用SQLite创建了一个单例类数据库,但是,当我试图从另一个视图控制器调用函数时,它会崩溃。运行到函数中的值是来自故事板两个文本字段的即时变量。在我将数据库代码放入viewcontroller类之前,尽管它会给出nil返回和崩溃,但我被告知将数据库代码放入另一个swift文件中,并使其成为单例

//
//  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)
    }
    }



}