如何在核心数据中移动行 - 使用故障教程 - IOS [英] How to move row in core data - use Faulting tutorial - IOS

查看:144
本文介绍了如何在核心数据中移动行 - 使用故障教程 - 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆