首页 > 解决方案 > 我的代码有什么问题?它给出了“线程 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
    }
}

我的警报实体如下所示: 实体

标签: iosswiftxcode

解决方案


推荐阅读