ios - 我的代码有什么问题?它给出了“线程 1:致命错误:未解决的错误错误域”
问题描述
一般来说,我是 Swift 编程的新手,我遇到了这个问题。当我尝试运行我的代码并且模拟器立即崩溃时,我收到一个线程 1:致命错误。我怀疑这与我的 dateTimeOfAlarm 有关,它是实体的一个属性。它在技术上是日期对象,但我想强制它成为一个字符串。
我已尝试遵循许多指南,但问题仍然存在。它总是同样的错误。
线程 1:致命错误:未解决的错误 Error Domain=NSCocoaErrorDomain Code=134140 "(null)" UserInfo={sourceModel=() isEditable 0, entities { Alarm = "() name Alarm, managedObjectClassName Alarm, renamingIdentifier Alarm is Abstract 0, superentity name (null), properties {\n dateTimeOfAlarm =\"(), name dateTimeOfAlarm, is Optional 1, isTransient 0, entity Alarm, renamingIdentifier dateTimeOfAlarm
我希望文本字段接收 DatePicker 作为输入,以确保输入保持固定日期格式。我怀疑这就是错误所在。
本质上,我有 2 个视图控制器。一个视图控制器接收来自用户的输入(“警报”实体),另一个在表格视图中显示该实体。我不确定 tableview 是否有效,因为应用程序不断崩溃。
第一个视图控制器:导入 UIKit 导入 CoreData
//purpose of this view controller is to take in inputs by engineer to be put into coredata
//the second view controller will then take the coredata items to display in a tableview
class ViewController: UIViewController {
//name of entity = Alarm
var alarmItems = [Alarm]() // array of alarm items called alarmItems
var moc: NSManagedObjectContext!
let appDelegate = UIApplication.shared.delegate as? AppDelegate
@IBOutlet weak var engineerName: UITextField!
@IBOutlet weak var dateTimeOfAlarm: UITextField!
lazy var datePicker: UIDatePicker = {
let picker = UIDatePicker()
picker.datePickerMode = .dateAndTime
picker.addTarget(self, action: #selector(datePickerChanged(_:)), for: .valueChanged)
return picker
}()
lazy var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .medium
return formatter
}()
@IBOutlet weak var trueFalseAlarmSelector: UISwitch!
@IBOutlet weak var engineerComments: UITextField!
//saving alarm attributes into coredata
@IBOutlet weak var submitButton: UIStackView!
override func viewDidLoad() {
super.viewDidLoad()
dateTimeOfAlarm.inputView = datePicker
engineerName.delegate = (self as UITextFieldDelegate)
dateTimeOfAlarm.delegate = (self as UITextFieldDelegate)
//trueFalseAlarmSelector.delegate = self
moc = appDelegate?.persistentContainer.viewContext
// Do any additional setup after loading the view.
loadData()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?){
engineerName.resignFirstResponder()
dateTimeOfAlarm.resignFirstResponder()
}
@objc func datePickerChanged(_ sender: UIDatePicker){
dateTimeOfAlarm.text = dateFormatter.string(from: sender.date)
}
/* I also tried this but this did not work
@IBAction func dateTimeOfAlarmEdit(_ sender: UITextField) {
let datePickerView = UIDatePicker()
datePickerView.datePickerMode = .dateAndTime
sender.inputView = datePickerView
datePickerView.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
}
//issue here i think
@objc func handleDatePicker(sender: UIDatePicker) {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMM yyyy HH:mm"
dateTimeOfAlarm.text = dateFormatter.string(from: sender.date)
}
*/
//sending the attributes to the coredata
@IBAction func submitAlarmAttributes(_ sender: UIButton) {
let alarmItem = Alarm(context: moc)
//true/false button checker
if trueFalseAlarmSelector.isOn {
alarmItem.trueOrFalseAlarm = true
} else {
alarmItem.trueOrFalseAlarm = false
}
alarmItem.nameOfEngineer = engineerName.text
alarmItem.dateTimeOfAlarm = dateTimeOfAlarm.text
alarmItem.engineerComments = engineerComments.text
appDelegate?.saveContext()
loadData()
}
//loadData will update the alarmItems array with the new and most current data from the database.
func loadData(){
let alarmRequest:NSFetchRequest<Alarm> = Alarm.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "dateTimeOfAlarm", ascending: false)
alarmRequest.sortDescriptors = [sortDescriptor]
do{try alarmItems=moc.fetch(alarmRequest)
} catch {
print("Could not load data")
}
//self.tableView.reloadData()
}
}
extension ViewController : UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
第二个视图控制器:import UIKit import CoreData
class SecondViewController: UIViewController, UITableViewDataSource {
var alarmItems = [Alarm]()
var moc: NSManagedObjectContext!
let appDelegate = UIApplication.shared.delegate as? AppDelegate
@IBOutlet weak var historyTable: UITableView!
@IBOutlet weak var uploadJson: UIButton!
@IBOutlet weak var refreshTable: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
self.historyTable.dataSource = self
//self.completedCaseTableView.dataSource = self
loadData()
}
func refreshButtonClick(_ sender: UIButton) {
loadData()
}
func loadData(){
let alarmRequest:NSFetchRequest<Alarm> = Alarm.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "dateTimeOfAlarm", ascending: false)
alarmRequest.sortDescriptors = [sortDescriptor]
do{try alarmItems=moc.fetch(alarmRequest)
} catch {
print("Could not load data")
}
//self.tableView.reloadData()
}
func numberOfSections (in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return alarmItems.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let alarmItem = alarmItems[indexPath.row]
let alarmDate = alarmItem.dateTimeOfAlarm as String?
cell.detailTextLabel?.text = alarmDate
let alarmEngineerName = alarmItem.nameOfEngineer as String?
cell.detailTextLabel?.text = alarmEngineerName
let alarmTrueFalse = alarmItem.trueOrFalseAlarm as Bool?
let alarmTrueFalseString = alarmTrueFalse?.description
cell.detailTextLabel?.text = alarmTrueFalseString
let alarmEngineerComments = alarmItem.engineerComments as String?
cell.detailTextLabel?.text = alarmEngineerComments
return cell
}
}
我的警报实体如下所示: 实体
解决方案
推荐阅读
- python - 抛出错误:AttributeError:“KenLogin”对象没有属性“驱动程序”
- c# - 如何使用 itextsharp 将数字签名图像或其字节 [] 保存到数据库中?
- ansible - Ansible:使用 with_items 循环两个寄存器变量
- ruby-on-rails - 如何使用选择添加三元条件
- mysql - 如何使用所见即所得的文本编辑器添加图像和文本并将它们一起保存到 MySQL 数据库中?
- google-apps-script - 如何查找正在运行的应用程序脚本?
- forms - 如何将露天权威现场控制与 OOTB ftl 集成?
- azure - 如何将大型有效载荷(即超过 150 KB)传递给其他功能?
- python - 如何使用python将值或文本添加到元素上方的其他级别
- jmeter - 有没有办法在不同的机器上分布运行不同的 jmx 脚本?