如何在核心数据中移动行 - 使用故障教程 - IOS [英] How to move row in core data - use Faulting tutorial - IOS
本文介绍了如何在核心数据中移动行 - 使用故障教程 - IOS的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用本教程错误创建列表
现在我想移动列表视图控制器中的行。
它成功移动行,但我不能保存这些更改
我经历了很多解决方案无法使用。
请帮助我
import UIKit
import CoreData
class ListViewController:UIViewController,UITableViewDataSource,UITableViewDelegate,NSFetchedResultsControllerDelegate {
let ReuseIdentifierItemCell =ItemCell
@IBOutlet weak var tableView:UITableView!
var list:List!
var managedObjectContext:NSManagedObjectContext {
get {
return list.managedObjectContext!
}
}
lazy var fetchedResultsController:NSFetchedResultsController = {
//初始化获取请求
let fetchRequest = NSFetchRequest(entityName:Item)
//添加排序描述符
let sortDescriptor = NSSortDescriptor(key:name,ascending:true)
fetchRequest.sortDescriptors = [sortDescriptor]
//谓词
let predicate = NSPredicate(format:%K ==%@,list,self.list)
fetchRequest.predicate = predicate
初始化获取的结果控制器
let fetchedResultsController = NSFetchedResultsController(fetchRequest:fetchRequest,managedObjectContext:self.managedObjectContext,sectionNameKeyPath:nil,cacheName:nil)
//配置获取结果控制器
fetchedResultsController .delegate = self
return fetchedResultsController
}()
// MARK: -
// MARK:查看生命周期
override func viewDidLoad(){
super.viewDidLoad()
do {
try self.fetchedResultsController.performFetch()
} catch {
let fetchError =错误为NSError
print(\(fetchError),\(fetchError.userInfo))
}
}
// MARK: $ b // MARK:表视图数据源方法
func numberOfSectionsInTableView(tableView:UITableView) - > Int {
if let sections = fetchedResultsController.sections {
return sections.count
}
return 0
}
func tableView(tableView:UITableView,numberOfRowsInSection section:Int) - > int {
if let sections = fetchedResultsController.sections {
let sectionInfo = sections [section]
return sectionInfo.numberOfObjects
}
return 0
}
func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath) - > UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierItemCell,forIndexPath:indexPath)
//配置表格视图单元格
configureCell(cell,atIndexPath:indexPath)
return cell
}
func configureCell(cell:UITableViewCell,atIndexPath indexPath:NSIndexPath){
// Fetch Item
let item = fetchedResultsController.objectAtIndexPath indexPath)as!项目
//更新单元格
cell.textLabel!.text = item.name
}
func tableView(tableView:UITableView,canEditRowAtIndexPath indexPath: NSIndexPath) - > Bool {
return true
}
func tableView(tableView:UITableView,commitEditingStyle editingStyle:UITableViewCellEditingStyle,forRowAtIndexPath indexPath:NSIndexPath){
if(editingStyle == .Delete ){
// Fetch Item
let item = fetchedResultsController.objectAtIndexPath(indexPath)as!项目
//删除项目
self.managedObjectContext.deleteObject(item)
}
}
// MARK: -
// MARK:Table View代理方法
func tableView(tableView:UITableView,didSelectRowAtIndexPath indexPath:NSIndexPath){
tableView.deselectRowAtIndexPath(indexPath,animated:true)
}
// MARK: -
// MARK:Fetched结果控制器委托方法
func controllerWillChangeContent(controller:NSFetchedResultsController){
tableView.beginUpdates()
}
func controllerDidChangeContent(controller:NSFetchedResultsController){
tableView.endUpdates()
}
func controller(controller:NSFetchedResultsController,didChangeObject anObject:AnyObject,atIndexPath indexPath :NSIndexPath ?, forChangeType类型:NSFetchedResultsChangeType,newIndexPath:NSIndexPath?){
switch(type){
case .Insert:
如果let indexPath = newIndexPath {
tableView.insertRowsAtIndexPaths [indexPath],withRowAnimation:.Fade)
}
break;
case .Delete:
如果let indexPath = indexPath {
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation:.Fade)
}
break;
case .Update:
if let indexPath = indexPath {
if let cell = tableView.cellForRowAtIndexPath(indexPath){
configureCell(cell,atIndexPath:indexPath)
}
}
break;
case .Move:
if let indexPath = indexPath {
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation:.Fade)
}
如果let newIndexPath = newIndexPath {
tableView.insertRowsAtIndexPaths([newIndexPath],withRowAnimation:.Fade)
}
break;
}
}
// MARK: -
// MARK:Actions
@IBAction func addItem(sender:UIBarButtonItem){
let entityDescription = NSEntityDescription.entityForName(Item,inManagedObjectContext:self.managedObjectContext)
//初始化项目
let item = Item(entity:entityDescription !, insertIntoManagedObjectContext:self.managedObjectContext)
//配置项目
item.list = self.list
item.name =\(list.name!) - Item \(numberOfItems())
//保存更改
do {
try self.managedObjectContext.save()
} catch {
let saveError = error as NSError
print(\(saveError),\(saveError.userInfo))
}
}
// MARK: -
// MARK:Helper方法
private func numberOfItems() - > Int {
var result = 0
如果let items = self.fetchedResultsController.fetchedObjects {
result = items.count
}
返回结果
}
}
解决方案
好了,我们错了修改这段代码:
/ p>
let sortDescriptor = NSSortDescriptor(key:position,ascending:true)
/ pre>
之后:
let sortDescriptor = NSSortDescriptor position,ascending:false)
感谢所有
I use this tutorial Faulting for create list of list
now I want to move row in the List View Controller.
It succeeded in move rows, but I can not save these changes
I've experienced a lot of solutions to no avail.
Please Help Me
import UIKit import CoreData class ListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { let ReuseIdentifierItemCell = "ItemCell" @IBOutlet weak var tableView: UITableView! var list: List! var managedObjectContext: NSManagedObjectContext { get { return list.managedObjectContext! } } lazy var fetchedResultsController: NSFetchedResultsController = { // Initialize Fetch Request let fetchRequest = NSFetchRequest(entityName: "Item") // Add Sort Descriptors let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) fetchRequest.sortDescriptors = [sortDescriptor] // Predicate let predicate = NSPredicate(format: "%K == %@", "list", self.list) fetchRequest.predicate = predicate // Initialize Fetched Results Controller let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) // Configure Fetched Results Controller fetchedResultsController.delegate = self return fetchedResultsController }() // MARK: - // MARK: View Life Cycle override func viewDidLoad() { super.viewDidLoad() do { try self.fetchedResultsController.performFetch() } catch { let fetchError = error as NSError print("\(fetchError), \(fetchError.userInfo)") } } // MARK: - // MARK: Table View Data Source Methods func numberOfSectionsInTableView(tableView: UITableView) -> Int { if let sections = fetchedResultsController.sections { return sections.count } return 0 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if let sections = fetchedResultsController.sections { let sectionInfo = sections[section] return sectionInfo.numberOfObjects } return 0 } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifierItemCell, forIndexPath: indexPath) // Configure Table View Cell configureCell(cell, atIndexPath: indexPath) return cell } func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) { // Fetch Item let item = fetchedResultsController.objectAtIndexPath(indexPath) as! Item // Update Cell cell.textLabel!.text = item.name } func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { return true } func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if (editingStyle == .Delete) { // Fetch Item let item = fetchedResultsController.objectAtIndexPath(indexPath) as! Item // Delete Item self.managedObjectContext.deleteObject(item) } } // MARK: - // MARK: Table View Delegate Methods func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { tableView.deselectRowAtIndexPath(indexPath, animated: true) } // MARK: - // MARK: Fetched Results Controller Delegate Methods func controllerWillChangeContent(controller: NSFetchedResultsController) { tableView.beginUpdates() } func controllerDidChangeContent(controller: NSFetchedResultsController) { tableView.endUpdates() } func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch (type) { case .Insert: if let indexPath = newIndexPath { tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } break; case .Delete: if let indexPath = indexPath { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } break; case .Update: if let indexPath = indexPath { if let cell = tableView.cellForRowAtIndexPath(indexPath) { configureCell(cell, atIndexPath: indexPath) } } break; case .Move: if let indexPath = indexPath { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } if let newIndexPath = newIndexPath { tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade) } break; } } // MARK: - // MARK: Actions @IBAction func addItem(sender: UIBarButtonItem) { let entityDescription = NSEntityDescription.entityForName("Item", inManagedObjectContext: self.managedObjectContext) // Initialize Item let item = Item(entity: entityDescription!, insertIntoManagedObjectContext: self.managedObjectContext) // Configure Item item.list = self.list item.name = "\(list.name!) - Item \(numberOfItems())" // Save Changes do { try self.managedObjectContext.save() } catch { let saveError = error as NSError print("\(saveError), \(saveError.userInfo)") } } // MARK: - // MARK: Helper Methods private func numberOfItems() -> Int { var result = 0 if let items = self.fetchedResultsController.fetchedObjects { result = items.count } return result } }
Thanks
解决方案Well, we went after the wrong modify this code:
Before:
let sortDescriptor = NSSortDescriptor(key: "position", ascending: true)
After:
let sortDescriptor = NSSortDescriptor(key: "position", ascending: false)
thanks for all
这篇关于如何在核心数据中移动行 - 使用故障教程 - IOS的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文