Got a fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value. I can't find the reason for the error - let results = try context.fetch(fetchRequest).
This is the block where I get the error:
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
let userName = "Max"
let fetchRequest: NSFetchRequest<User> = User.fetchRequest() //хотим получать данные по юзеру
fetchRequest.predicate = NSPredicate(format: "name == %@", userName) //пишем предикат для имени
do {
let results = try context.fetch(fetchRequest)
if results.isEmpty {
user = User(context: context) //если нет юзера Макс, то создаем его и помещаем в контекст
user.name = userName //создали и присвоили имя
try context.save() //сохраняем
} else {
user = results.first //если есть юзер в базе, то сразу присваиваем его в var user: User!
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
}
And this is all ViewController code:
import UIKit
import CoreData
class ViewController: UIViewController {
@IBOutlet var tableView: UITableView!
var context: NSManagedObjectContext!
var user: User!
lazy var dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .short
formatter.timeStyle = .short
return formatter
}()
@IBAction func addButtonPressed(_ sender: UIBarButtonItem) {
let meal = Meal(context: context) //создали объект мил
meal.date = Date() //присвоили ему текущую дату
//создаем копию приемов пищи у юзера
let meals = user.meals?.mutableCopy() as? NSMutableOrderedSet //массив
meals?.add(meal) //добавляем новый примем пищи meals
user.meals = meals //присвоили юзеру новый массив
do {
try context.save()
tableView.reloadData()
} catch let error as NSError {
print(error.localizedDescription)
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
let userName = "Max"
let fetchRequest: NSFetchRequest<User> = User.fetchRequest() //хотим получать данные по юзеру
fetchRequest.predicate = NSPredicate(format: "name == %@", userName) //пишем предикат для имени
do {
let results = try context.fetch(fetchRequest)
if results.isEmpty {
user = User(context: context) //если нет юзера Макс, то создаем его и помещаем в контекст
user.name = userName //создали и присвоили имя
try context.save() //сохраняем
} else {
user = results.first //если есть юзер в базе, то сразу присваиваем его в var user: User!
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
}
// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "My happy meal time"
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return user.meals?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell
//нужно получить конкретны�� прием пищи и поместить его в конкретную строку
guard let meal = user.meals?[indexPath.row] as? Meal,
let mealDate = meal.date
else { return cell } //если не получилось просто вернули пустую ячейку
cell.textLabel!.text = dateFormatter.string(from: mealDate)
return cell
}
}
var context: NSManagedObjectContext!
Where is setcontext
? It's declared, but I don't see where it's set. I guess it'snil
. And since you declared itvar context: NSManagedObjectContext!
with a question mark, it's says: "Don't worry, it can be nil, else crash with error Unexpectedly found nil while implicitly unwrapping an Optional value if it's used and is nil".