问题描述
如果我问错了或包含了太多代码,请见谅。我做的最后一个编程是在 amiga 和 Psion 组织者上使用 basic。所以我是 swift 的新手,甚至是堆栈溢出的新手。 我正在使用来自各种来源的信息(Angela Yu、Ray Wenderlich、google 和 stack overflow 以及许多其他来源,并且感到困惑。我正在尝试创建一个简单的数据库应用程序并实现了很多我想要的,但我可以现在不使用滑动删除或确实执行删除记录。我需要知道的是 a] 我需要什么代码来执行一个单元格的滑动并删除与之相关的数据。我已经包含了我正在使用的函数,直到我改变了一些东西。 b] 我认为我说我采用了不止一种方法是正确的,所以如果有人能建议可以改进的地方,我将非常感激。
import UIKit
import CoreData
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
// var people: [NSManagedobject] = []
var people = [DriverName]()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
lazy var coreDataStack = CoreDataStack(modelName: "RDW_Monitor")
var dataSource: UITableViewDiffableDataSource<String,DriverName>?
fileprivate let driverCellIdentifier = "driverandRDWCell"
lazy var fetchedResultsController: NSFetchedResultsController<DriverName> = {
let fetchRequest: NSFetchRequest<DriverName> = DriverName.fetchRequest()
let nameSort = NSSortDescriptor(key: #keyPath(DriverName.name),ascending: true)
let rdwSort = NSSortDescriptor(key: #keyPath(DriverName.total),ascending: true)
fetchRequest.sortDescriptors = [rdwSort,nameSort]
let fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,managedobjectContext: coreDataStack.managedContext,sectionNameKeyPath: nil,cacheName: "driverName")
fetchedResultsController.delegate = self
return fetchedResultsController
}()
var totalNumberOfdrivers = 0
var vaughansTotal = 0
override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 30
loadDrivers()
getDriverTotal(nametoGet: "Wingrove V")
title = "Driver Names & Total RDW \(totalNumberOfdrivers)"
dataSource = setupDataSource()
self.tableView.reloadData()
}
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return people.count
}
override func viewDidAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIView.performWithoutAnimation {
do {
try fetchedResultsController.performFetch()
} catch let error as NSError {
print("Fetching error: \(error),\(error.userInfo)")
}
}
}
//---------------------------------------------------------------------------------------
//MARK: - ADD a name
@IBAction func addName(_ sender: UIBarButtonItem) {
let alertController = UIAlertController(title: "Add Driver",message: nil,preferredStyle: .alert)
alertController.addTextField { (newDriverName) in
newDriverName.placeholder = "Name"
}
alertController.addTextField(configurationHandler: { (newRDW) in
newRDW.keyboardType = .numberPad
newRDW.placeholder = "Starting Number of RDW"
})
let saveAction = UIAlertAction(title: "Save",style: .default) {_ in
if alertController.textFields![0].hasText && alertController.textFields![1].hasText {
let newDriverNameField = alertController.textFields![0]
let newRDWField = alertController.textFields![1]
let newRDW = Int(newRDWField.text!)
let driverName = DriverName(context: self.coreDataStack.managedContext)
driverName.name = newDriverNameField.text
driverName.totalText = newRDWField.text
driverName.total = Int32(newRDW!)
self.coreDataStack.saveContext()
self.totalNumberOfdrivers += 1
self.title = "Driver Names & Total RDW \(self.totalNumberOfdrivers)"
self.tableView.reloadData()
} else {
return
}
}
let cancelAction = UIAlertAction(title: "Cancel",style: .cancel)
alertController.addAction(saveAction)
alertController.addAction(cancelAction)
present(alertController,animated: true)
}
//MARK: - Load Drivers
func loadDrivers() {
let request : NSFetchRequest<DriverName> = DriverName.fetchRequest()
do {
people = try context.fetch(request)
} catch {
print("Error fetching data from context \(error)")
}
}
//MARK: - Get Driver Total
func getDriverTotal(nametoGet: String) {
let nameFetch: NSFetchRequest<DriverName> = DriverName.fetchRequest()
nameFetch.predicate = nspredicate(format: "%K == %@",#keyPath(DriverName.name),nametoGet)
var x = 0
totalNumberOfdrivers = people.count
while x != people.count {
let person = people[x]
if person.value(forKeyPath: "name") as! String == nametoGet {
vaughansTotal = person.value(forKeyPath: "total") as! Int
}
x = x + 1
}
}
//---------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
//MARK: - delete a row
// func tableView(_ tableView: UITableView,canEditRowAt indexPath: IndexPath) -> Bool {
// return true
// }
// func tableView(_ tableView: UITableView,commit editingStyle: UITableViewCell.EditingStyle,forRowAt indexPath: IndexPath) {
// if editingStyle == .delete {
//
// guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
// return
// }
// let managedContext = appDelegate.persistentContainer.viewContext
// managedContext.delete(driverName[indexPath.row])
// do {
// try managedContext.save()
// } catch {
//
// }
// driverName.remove(at: indexPath.row)
// tableView.deleteRows(at: [indexPath],with: .fade)
//
// totalNumberOfdrivers -= 1
// title = "Driver Names & Total RDW \(totalNumberOfdrivers)"
// self.tableView.reloadData()
//
// } else if editingStyle == .insert {
// // Create a new instance of the appropriate class,insert it into the array,and add a new row to the table view.
// }
// }
}
// MARK: - Internal
extension ViewController {
func setupDataSource() -> UITableViewDiffableDataSource<String,DriverName> {
return UITableViewDiffableDataSource(tableView: tableView) { [uNowned self](tableView,indexPath,driverName) -> UITableViewCell? in
let cell = tableView.dequeueReusableCell(withIdentifier: self.driverCellIdentifier,for: indexPath)
self.configure(cell: cell,for: driverName)
return cell
}
}
func configure(cell: UITableViewCell,for driverName: DriverName) {
guard let cell = cell as? DriverNameCell else {
return
}
if vaughansTotal < driverName.total {
cell.detail.textColor = UIColor.red
cell.title.text = driverName.name
cell.detail.text = driverName.totalText
} else {
cell.detail.textColor = UIColor.black
cell.title.text = driverName.name
cell.detail.text = driverName.totalText
}
}
}
// MARK: - NSFetchedResultsControllerDelegate
extension ViewController: NSFetchedResultsControllerDelegate {
func controller(
_ controller: NSFetchedResultsController<NSFetchRequestResult>,didChangeContentWith
snapshot: NSDiffableDataSourceSnapshotReference) {
var diff = NSDiffableDataSourceSnapshot<String,DriverName>()
snapshot.sectionIdentifiers.forEach { section in
diff.appendSections([section as! String])
let items = snapshot.itemIdentifiersInSection(withIdentifier: section)
.map { (objectId: Any) -> DriverName in
let oid = objectId as! NSManagedobjectID
return controller.managedobjectContext.object(with: oid) as! DriverName
}
diff.appendItems(items,toSection: section as? String)
}
dataSource?.apply(diff)
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)