我的代码有什么问题?它给出了“线程1:致命错误:未解决的错误错误域”

时间:2019-06-07 06:31:47

标签: ios swift xcode

一般来说,我是Swift编程的新手,因此遇到了这个问题。当我尝试运行代码并且模拟器立即崩溃时,我收到线程1:致命错误。我怀疑这与我的dateTimeOfAlarm有关,后者是实体的属性。从技术上讲,它是日期对象,但我想强迫它成为字符串。

我尝试遵循许多指南,但问题仍然存在。总是一样的错误。

Fatal Error

  

线程1:致命错误:未解决的错误错误域= NSCocoaErrorDomain代码= 134140“(null)” UserInfo = {sourceModel =()isEditable 0,实体{       Alarm =“()name Alarm,managedObjectClassName Alarm,renamingIdentifier Alarm是摘要0,实体名称(空),属性{\ n dateTimeOfAlarm = \”(),名称dateTimeOfAlarm,是可选1,isTransient 0,实体Alarm,renamingIdentifier dateTimeOfAlarm < / p>

我希望文本字段接收DatePicker作为输入,以确保输入保持固定的日期格式。我怀疑这是错误所在。

本质上,我有2个视图控制器。一个视图控制器从用户(“警报”实体)接收输入,另一个视图控制器在表视图中显示该实体。我不确定该表视图是否正常工作,因为该应用程序一直崩溃。

第一个视图控制器: 导入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
    }
}

第二个视图控制器:     导入UIKit     导入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
    }
}

我的警报实体看起来像这样: Entity

0 个答案:

没有答案