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

Posted

技术标签:

【中文标题】如何使用coredata从上到下对tableview项目进行排序【英文标题】:How to sort tableview item top to bottom using coredata 【发布时间】:2019-01-06 10:49:10 【问题描述】:

我正在尝试在 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()

【问题讨论】:

在 fetch 请求中添加 NSSortDescriptor 或者——更好的是——使用自动处理排序的 NSFetchedResultsController 感谢您的回答。它现在可以工作,但只有当我输入数字时,但当我输入名字时,当我重新启动我的应用程序时它仍然会下降,但数字仍然写顺序。 Core Data 总是无序地保存记录。如果您想要自定义订单,则必须添加索引属性并按索引对记录进行排序 如果你看到我上面的代码。你的意思是“myIndex” 基本上是的。但索引也必须是Core Data实体的一个属性(如name 【参考方案1】:Person 实体中添加index 类型的Int32 属性

在控制器中添加一个方法来重新索引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()

【讨论】:

以上是关于如何使用coredata从上到下对tableview项目进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中给出从上到下的动画?

从上到下滚动时如何自动停止对项目的列表视图取消选择?

如何让容器从上到下向下滚动

如何从上到下创建 UINavigationController 动画 [重复]

如何在移动布局上从上到下移动 div? [复制]

如何使用Java中的PDFPTable将2个表从上到下添加到单个表中