一般来说,我是Swift编程的新手,因此遇到了这个问题。当我尝试运行代码并且模拟器立即崩溃时,我收到线程1:致命错误。我怀疑这与我的dateTimeOfAlarm有关,后者是实体的属性。从技术上讲,它是日期对象,但我想强迫它成为字符串。
我尝试遵循许多指南,但问题仍然存在。总是一样的错误。
线程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