首页 > 解决方案 > 无法识别的选择器发送到实例 0x7feb26814010'

问题描述

我已经使用 SQLite 创建了一个单例类数据库,但是,当我尝试从另一个视图控制器调用 a 时,数据库中的函数会崩溃。运行到函数中的值是来自故事板的两个文本字段的即时变量。在我将数据库代码放入 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)
        }
    }
    
}


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



}


标签: swiftdatabasexcodesqlite

解决方案


推荐阅读