如何使用 coredata 从上到下对 tableview 项目进行排序

How to sort tableview item top to bottom using coredata

我正在尝试在 tableView 中创建一个名称列表,并将其从上到下排序,我正在使用 coreData 保存所有信息,但是当我重新启动我的应用程序时,我的 tableView 是从下到上排序的,而不是从上到下。

我尝试过许多其他方法,但对此感到困惑。

我的 coreData 实体 "Person" 里面有 "name"

import UIKit
import CoreData

var newList = [Person]()
var currentList = [Person]()
var myIndex = 0

class TableViewVC_SmartAccounting: UIViewController,UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UITextFieldDelegate {

@IBOutlet weak var txtField: UITextField!
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var outAdd: UIButton!
@IBOutlet weak var searchBar: UISearchBar!

override func viewDidLoad() {
    super.viewDidLoad()
    fetchData()
    newList = currentList
    searchBar.backgroundImage = UIImage()
    txtField.returnKeyType = UIReturnKeyType.done
    txtField.delegate = self
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

}


func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    txtField.resignFirstResponder()
    print("RETURN")
    return true
}

func fetchData(){

    let fetchRequist: NSFetchRequest<Person> = Person.fetchRequest()
    do {
        let listFetched = try PersistenceService.context.fetch(fetchRequist)
        currentList = listFetched
        self.tableView.reloadData()
    } catch let err as NSError {
        print("Field to fetch an item", err)
    }
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return currentList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellVC_SmartAccounting
    cell.lblName.text = currentList[indexPath.row].name
    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 person = currentList.remove(at: indexPath.row)
        PersistenceService.context.delete(person)
        PersistenceService.saveContext()
        self.tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    myIndex = indexPath.row
    performSegue(withIdentifier: "segue", sender: self)
    tableView.deselectRow(at: indexPath, animated: true)
}

func addPerson(){
    if txtField.text != ""{

        let person = Person(context: PersistenceService.context)
        person.name = txtField.text
        PersistenceService.saveContext()
       // currentList.append(person)
        currentList.insert(person, at: myIndex)
        view.endEditing(true)
        newList = currentList
        let indexPath = IndexPath(row: myIndex, section: 0)
        tableView.insertRows(at: [indexPath], with: .left)

       // tableView.insertRows(at: [IndexPath(row: list.count - 1, section: 0)], with: .automatic)
    }
    txtField.text = ""
    self.view.endEditing(true)


}

func setUpSearchBar() {
    searchBar.delegate = self
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    self.searchBar.endEditing(true)
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    guard !searchText.isEmpty else {currentList = newList
        tableView.reloadData()
        return }
    currentList = newList.filter ({ (Person) -> Bool in
        (Person.name?.lowercased().contains(searchText.lowercased()))!
    })
    tableView.reloadData()
}

func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
}

@IBAction func btnAdd(_ sender: Any) {
    addPerson()
}

}

  • Person 实体中添加类型 Int32
  • 的属性 index
  • 在控制器中添加一个方法来重新索引currentList并保存上下文

    func reindex()
    {
        for (index, person) in currentList.enumerated() {
            person.index = Int32(index)
        }
        PersistenceService.saveContext()
     }
    
  • fetchData中添加排序描述符

    fetchRequist.sortDescriptors = [NSSortDescriptor(key: "index", ascending: true)] 
    
  • 插入对象后重新索引数组

    let person = Person(context: PersistenceService.context)
    person.name = txtField.text
    person.index = Int32(myIndex)
    currentList.insert(person, at: myIndex)
    let indexPath = IndexPath(row: myIndex, section: 0)
    tableView.insertRows(at: [indexPath], with: .left)
    reindex()
    view.endEditing(true)
    newList = currentList
    
  • 并且在删除对象后也重新索引数组

    if editingStyle == .delete {
        let person = currentList.remove(at: indexPath.row)
        PersistenceService.context.delete(person)
        self.tableView.deleteRows(at: [indexPath], with: .fade)
        reindex()
    }