我是Core Data的新手,并且认为我可能会让自己的事情变得比需要的更难,因为我似乎在View Controllers中重复代码。我已成功设法使用以下代码填充包含核心数据条目的表:
import UIKit
import CoreData
class ClientListViewController: UIViewController, UITabBarDelegate, UITableViewDataSource {
var clientItems : [Client] = []
@available(iOS 2.0, *)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return clientItems.count
}
@available(iOS 2.0, *)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell
let items = clientItems[indexPath.row]
cell.textLabel?.text = items.name
cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
return cell
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
clientItems = try context.fetch(Client.fetchRequest())
} catch {
print("Fetch Failed")
}
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
if editingStyle == .delete {
let item = clientItems[indexPath.row]
context.delete(item)
(UIApplication.shared.delegate as! AppDelegate).saveContext()
do {
clientItems = try context.fetch(Client.fetchRequest())
} catch {
print("Fetch Failed")
}
}
tableView.reloadData()
}
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
navigationController?.navigationBar.prefersLargeTitles = true
}
override func viewWillAppear(_ animated: Bool) {
getData()
tableView.reloadData()
}
}
此代码按预期显示表中的客户端名称,但是当我单击该单元格时,我希望它加载我的新视图,显示在核心数据中为它们存储的所有客户端信息。首先,我希望导航栏标题是从前一个View Controller上的单元格中点击的人员名称,但我的代码始终显示第一个条目,因为我说[0]如何提供的数据来自实际行在另一个View Controller的表格中选择。
我很困惑,似乎在这个过程中重复不必要的代码。这是我的第二个View Controllers代码:
import UIKit
import CoreData
class ClientViewController: UIViewController {
var clientItems : [Client] = []
@IBOutlet weak var nameLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
getData()
navigationItem.title = String(describing: clientItems[0].name!)
print(clientItems[0].name!)
}
func getData() {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
do {
clientItems = try context.fetch(Client.fetchRequest())
} catch {
print("Fetch Failed")
}
}
}