swift - 无法识别的选择器发送到实例 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)
}
}
}
解决方案
推荐阅读
- google-cloud-storage - GCS 存储桶名称的“全局”唯一性是什么?
- amazon-web-services - 将本地笔记本电脑配置为 puppet 服务器,将 aws ec2 实例配置为 puppet 代理
- java - OkHttpClient 不向请求添加标头
- c# - 是否有一个选项可以为不可能的“OfType”调用生成编译器错误
- javascript - 需要帮助调整重新格式化的日期
- javascript - 如何在一行中获取数组列表而不是 VS Code 中的行?
- coq - 归纳定义中 Coq 隐式类型推导的规则是什么?
- mysql - 我不了解数据库的 docker 卷
- ios - xCode Archive 在完成前自动取消
- razor - 为什么 Blazor Webassembly 应用程序中的每个 razor 页面导航都会出现“加载...”延迟?