Я сохранил несколько объектов базовых данных в своем хранилище основных данных, а также напечатал количество элементов в объекте базовых данных, и там указано 4. К сожалению, он никогда не достигает метода cellForRowAtIndexPath для загрузки данных, которых у меня нет идея почему.
Вот мой контроллер просмотра:
import UIKit
import CoreData
class CustomersViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, DataReceived {
//MARK: - Variables
@IBOutlet weak var customersTableView: UITableView!
var customers = [Customer]()
var customersModel = [CustomerModel]()
var context = PersistanceService.context
//MARK: - Lifecycle Methods
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = #colorLiteral(red: 0.4772838354, green: 0.7987893224, blue: 0.9529026151, alpha: 1)
customersTableView.backgroundColor = #colorLiteral(red: 0.4772838354, green: 0.7987893224, blue: 0.9529026151, alpha: 1)
if loadData() {
print("loading items from local persistancy")
} else {
print("local persistancy is empty")
}
customersTableView.dataSource = self
customersTableView.delegate = self
customersTableView.register(UINib(nibName: "CustomerCell", bundle: nil), forCellReuseIdentifier: "customer")
}
//MARK: - Tableview delegate & datasource methods
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "customer", for: indexPath) as! CustomerCell
let currentCustomer = customersModel[indexPath.row]
cell.nameAndRegionLabel.text = "\(currentCustomer.name!) from \(currentCustomer.region!)."
cell.genderAndAgeLabel.text = "\(currentCustomer.gender!), \(currentCustomer.age) Years Old."
cell.layer.borderColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
cell.layer.borderWidth = 1
cell.layer.cornerRadius = 20
cell.clipsToBounds = true
return cell
}
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let item = customersModel.remove(at: indexPath.row)
context.delete(item)
tableView.deleteRows(at: [indexPath], with: .fade)
saveData()
}
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return customers.count
}
//MARK: - Segue methods
@IBAction func moveToNewCostumerVC(_ sender: Any) {
performSegue(withIdentifier: "newCustomer", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "newCustomer" {
let newCustomerVC = segue.destination as! NewCustomerViewController
newCustomerVC.delegate = self
}
}
// MARK: - New Customer Data Delegate Method & Saving to Core Data
func dataReceived(customer: CustomerModel) {
customersModel.append(customer)
customersTableView.reloadData()
print(customersModel.count)
saveData()
customersTableView.reloadData()
}
func saveData(){
do {
try context.save()
print("data saved successfully")
} catch {
print("error saving context, \(error.localizedDescription)")
}
}
//MARK: - Retreving From Core Data
func loadData()->Bool{
let fetchRequest : NSFetchRequest<CustomerModel> = CustomerModel.fetchRequest()
do {
var customersFromPersistancy = try PersistanceService.context.fetch(fetchRequest)
print(customersFromPersistancy.count)
if customersFromPersistancy.count == 0 {return false}
customersFromPersistancy = customersModel
return true
} catch {
print("error fetching from core data, \(error)")
return false
}
}
}
Как вы можете видеть, в функции loadData () я печатаю количество объектов в массиве объектов базовых данных, и результат при запуске приложения равен 4. После этого я вызываю метод tableView.reloadData (), который должен (?) вызвать cellForRowAtIndexPath и перезагрузить набор данных с нуля, и он никогда этого не сделает.
Спасибо!