Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何筛选核心数据中包含对象的tableview?_Ios_Swift_Uitableview_Core Data_Nsfetchedresultscontroller - Fatal编程技术网

Ios 如何筛选核心数据中包含对象的tableview?

Ios 如何筛选核心数据中包含对象的tableview?,ios,swift,uitableview,core-data,nsfetchedresultscontroller,Ios,Swift,Uitableview,Core Data,Nsfetchedresultscontroller,我正在创建一个联系人应用程序,到目前为止,我已成功地将项目保存到我的tableview。我有一个搜索栏,我想按名字过滤我的单元格,我知道因为我在处理核心数据,所以我必须使用fetchResultsController和NSPredicate。我很难弄清楚这一切,也许有人能帮我解决 这里还有我的核心数据实体,以防万一 实体:联系人 属性: 名字,字符串 姓氏,字符串 出生日期,字符串 电话号码,字符串 zipCode,字符串 我知道有些代码可能不完整,但我只需要知道该怎么做。我只想让用户键入一

我正在创建一个联系人应用程序,到目前为止,我已成功地将项目保存到我的tableview。我有一个搜索栏,我想按名字过滤我的单元格,我知道因为我在处理核心数据,所以我必须使用fetchResultsController和NSPredicate。我很难弄清楚这一切,也许有人能帮我解决

这里还有我的核心数据实体,以防万一

实体:联系人

属性:

  • 名字,字符串
  • 姓氏,字符串
  • 出生日期,字符串
  • 电话号码,字符串
  • zipCode,字符串
我知道有些代码可能不完整,但我只需要知道该怎么做。我只想让用户键入一个名称,它会按名字过滤单元格。如果您需要更多信息,请告诉我

下面是myContactStableC中的代码:

import UIKit
import CoreData

class ContactsTableVC: UITableViewController, UISearchBarDelegate, NSFetchedResultsControllerDelegate {

    @IBOutlet weak var searchBar: UISearchBar!

    var isFiltered: Bool = false

//Holds the core data model
    var persons: [Person] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.delegate = self

        self.tableView.separatorStyle = UITableViewCellSeparatorStyle.none
        self.tableView.backgroundColor = UIColor(red: 240/255.0, green: 240/255.0, blue: 240/255.0, alpha: 1.0)

        fetch()
        self.tableView.reloadData()
    }

    func getContext () -> NSManagedObjectContext {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        return appDelegate.persistentContainer.viewContext
    }

    // MARK: - Searchbar
    //add fetchrequest to did ebgin editing
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {

    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        if(searchBar.text == "") {
            isFiltered = false
        } else {
            isFiltered = true
        }
    }

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filter(text: searchText)
    }

    // MARK: - Fetchresults controller / filtering data

    func filter(text: String) {
        //Create fetch request
        let fetchRequest = NSFetchRequest<Person>()

//        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }         replaced with getcontext
//        let managedObjectContext = appDelegate.persistentContainer.viewContext

        let entity = NSEntityDescription.entity(forEntityName: "Contact", in: getContext())
        fetchRequest.entity = entity

        let sortDescriptor = NSSortDescriptor(key: "firstName", ascending: false)
        let sortDescriptors: [Any] = [sortDescriptor]
        fetchRequest.sortDescriptors = sortDescriptors as? [NSSortDescriptor] ?? [NSSortDescriptor]()

        if(text.characters.count > 0) {
            let predicate = NSPredicate(format: "(firstName CONTAINS[c] %@)", text)
            fetchRequest.predicate = predicate
        }

        let loadedEntities: [Person]? = try? getContext().fetch(fetchRequest)
        filteredContacts = [Any](arrayLiteral: loadedEntities) as! [Person]
        self.tableView.reloadData()
    }

    // MARK: - Data Source
    func fetch() {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:"Contact")
        do {
            persons = try managedObjectContext.fetch(fetchRequest) as! [Person] //NSManagedObject
        } catch let error as NSError {
            print("Could not fetch. \(error)")
        }
    }

    func save(firstName: String, lastName: String, dob: String, phoneNumber: String, zipCode: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        guard let entity = NSEntityDescription.entity(forEntityName:"Contact", in: managedObjectContext) else { return }
        let person = NSManagedObject(entity: entity, insertInto: managedObjectContext)
        person.setValue(firstName, forKey: "firstName")
        person.setValue(lastName, forKey: "lastName")
        person.setValue(dob, forKey: "dateOfBirth")
        person.setValue(phoneNumber, forKey: "phoneNumber")
        person.setValue(zipCode, forKey: "zipCode")
        do {
            try managedObjectContext.save()
            self.persons.append(person as! Person) //previously just contact, no casting!
        } catch let error as NSError {
            print("Couldn't save. \(error)")
        }
    }

    func update(indexPath: IndexPath, firstName: String, lastName: String, dob: String, phoneNumber: String, zipCode: String) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        let contact = persons[indexPath.row]
        contact.setValue(firstName, forKey: "firstName")
        contact.setValue(lastName, forKey: "lastName")
        contact.setValue(dob, forKey: "dateOfBirth")
        contact.setValue(phoneNumber, forKey: "phoneNumber")
        contact.setValue(zipCode, forKey: "zipCode")
        do {
            try managedObjectContext.save()
            persons[indexPath.row] = contact
        } catch let error as NSError {
            print("Couldn't update. \(error)")
        }
    }

    func delete(_ contact: NSManagedObject, at indexPath: IndexPath) {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedObjectContext = appDelegate.persistentContainer.viewContext
        managedObjectContext.delete(contact)
        persons.remove(at: indexPath.row)

        //Always remember to save after deleting, updates Core Data
        do {
            try managedObjectContext.save()
        } catch {
            print("Something went wrong \(error.localizedDescription)")
        }
    }

    // MARK: - Table View Setup
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell", for: indexPath) as? PersonsCell

        let person = persons[indexPath.row]

        cell?.firstName?.text = person.value(forKey:"firstName") as? String
        cell?.lastName?.text = person.value(forKey:"lastName") as? String
        cell?.dob?.text = person.value(forKey:"dateOfBirth") as? String
        cell?.phoneNumber?.text = person.value(forKey:"phoneNumber") as? String
        cell?.zipCode?.text = person.value(forKey:"zipCode") as? String

        return cell!
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 75
    }

    // Override to support conditional editing of the table view.
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }

    // MARK: - Navigation
    @IBAction func unwindToContactsList(segue:UIStoryboardSegue) {
        if let viewController = segue.source as? AddContactVC {
            guard let _firstName: String = viewController.firstNameLbl.text,
                let _lastName: String = viewController.lastNameLbl.text,
                let _dob: String = viewController.dateOfBirthLbl.text,
                let _phoneNumber: String = viewController.phoneNumberLbl.text,
                let _zipCode: String = viewController.zipCodeLbl.text
                else { return }
            if _firstName != "" && _lastName != "" && _dob != "" && _phoneNumber != "" && _zipCode != "" {
                if let indexPath = viewController.indexPathForContact {
                    update(indexPath: indexPath, firstName: _firstName, lastName: _lastName, dob: _dob, phoneNumber: _phoneNumber, zipCode: _zipCode)
                    print("Any updates?")
                } else {
                    save(firstName: _firstName, lastName: _lastName, dob: _dob, phoneNumber: _phoneNumber, zipCode: _zipCode)
                    print("added to tableview") //this runs twice for some reason...
                }
            }
            tableView.reloadData()
        } else if let viewController = segue.source as? EditContactVC {
            if viewController.isDeleted {
                guard let indexPath: IndexPath = viewController.indexPath else { return }
                let person = persons[indexPath.row]
                delete(person, at: indexPath)
                tableView.reloadData()
            }
        }
    }
}
导入UIKit
导入CoreData
类ContactStableC:UITableViewController、UISearchBarDelegate、NSFetchedResultsControllerDelegate{
@ibvar搜索栏:UISearchBar!
变量isFiltered:Bool=false
//保存核心数据模型
变量人员:[人员]=[]
重写func viewDidLoad(){
super.viewDidLoad()
searchBar.delegate=self
self.tableView.separatorStyle=UITableViewCellSeparatorStyle.none
self.tableView.backgroundColor=UIColor(红色:240/255.0,绿色:240/255.0,蓝色:240/255.0,alpha:1.0)
fetch()
self.tableView.reloadData()
}
func getContext()->NSManagedObjectContext{
让appDelegate=UIApplication.shared.delegate为!appDelegate
返回appDelegate.persistentContainer.viewContext
}
//标记:-搜索栏
//将fetchrequest添加到did ebgin编辑
func searchBarTextDidBeginEditing(searchBar:UISearchBar){
}
func SearchBartextdidediting(searchBar:UISearchBar){
如果(searchBar.text==“”){
isFiltered=false
}否则{
isFiltered=true
}
}
func searchBar(searchBar:UISearchBar,textDidChange searchText:String){
过滤器(文本:searchText)
}
//标记:-获取结果控制器/筛选数据
func筛选器(文本:字符串){
//创建提取请求
让fetchRequest=NSFetchRequest()
//让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}替换为getcontext
//让managedObjectContext=appDelegate.persistentContainer.viewContext
让entity=NSEntityDescription.entity(在:getContext()中,名为“Contact”)
fetchRequest.entity=实体
让sortDescriptor=NSSortDescriptor(键:“firstName”,升序:false)
让sortDescriptor:[任何]=[sortDescriptor]
fetchRequest.sortDescriptors=sortDescriptors为?[NSSortDescriptor]??[NSSortDescriptor]()
如果(text.characters.count>0){
let predicate=NSPredicate(格式:“(firstName包含[c]]@)”,文本)
fetchRequest.predicate=谓词
}
让loadedEntities:[Person]?=尝试?getContext().fetch(fetchRequest)
filteredContacts=[Any](ArrayTerral:loadedEntities)作为![Person]
self.tableView.reloadData()
}
//标记:-数据源
func fetch(){
让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}
让managedObjectContext=appDelegate.persistentContainer.viewContext
let fetchRequest=NSFetchRequest(entityName:“联系人”)
做{
persons=尝试managedObjectContext.fetch(fetchRequest)作为![Person]//NSManagedObject
}将let错误捕获为NSError{
打印(“无法获取.\(错误)”)
}
}
func save(firstName:String,lastName:String,dob:String,phoneNumber:String,zipCode:String){
让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}
让managedObjectContext=appDelegate.persistentContainer.viewContext
guard let entity=NSEntityDescription.entity(forEntityName:“Contact”,在:managedObjectContext中)else{return}
让person=NSManagedObject(实体:实体,插入到:ManagedObject上下文)
person.setValue(firstName,forKey:“firstName”)
person.setValue(lastName,forKey:“lastName”)
person.setValue(dob,forKey:“出生日期”)
person.setValue(phoneNumber,forKey:“phoneNumber”)
person.setValue(zipCode,forKey:“zipCode”)
做{
请尝试managedObjectContext.save()
self.persons.append(person as!person)//以前只需联系,无需施法!
}将let错误捕获为NSError{
打印(“无法保存。\(错误)”)
}
}
func更新(indepath:indepath,firstName:String,lastName:String,dob:String,phoneNumber:String,zipCode:String){
让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}
让managedObjectContext=appDelegate.persistentContainer.viewContext
let contact=persons[indexPath.row]
contact.setValue(firstName,forKey:“firstName”)
contact.setValue(lastName,forKey:“lastName”)
contact.setValue(dob,forKey:“出生日期”)
contact.setValue(phoneNumber,forKey:“phoneNumber”)
contact.setValue(zipCode,forKey:“zipCode”)
做{
请尝试managedObjectContext.save()
人员[indexath.row]=联系人
}将let错误捕获为NSError{
打印(“无法更新。\(错误)”)
}
}
func delete(contact:NSManagedObject,位于indexath:indexPath){
让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}
让managedObjectContext=appDelegate.persistentContainer.viewContext
managedObjectContext.delete(联系人)
persons.remove(位于:indexPath.row)
//阿尔瓦
class ContactViewController: UITableViewController {
    let fetchedResultsController: NSFetchedResultsController<Contact>!

    func searchTextFieldDidEditingChanged(_ textField: UITextField) {
        let text = textField.text ?? ""
        refetch(with: text)
    }

    // The key is you need change the predicate when searchTextField's 
    // value changed, and invoke proformFetch() again
    func refetch(with text: String) {
        let predicate = NSPredicate(format: "firstName CONTAINS %@", text)
        fetchedResultsController.fetchRequest.predicate = predicate

        do {
            try self.fetchedResultsController.performFetch()
            tableView.reloadData()
        } catch let error as NSError {
            loggingPrint("Error: \(error.localizedDescription)")
        }
    }
}

// MARK: - Table datasource

extension ContactViewController {
    override func numberOfSections(in tableView: UITableView) -> Int {
        return fetchedResultsController.sections!.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let sectionInfo = fetchedResultsController.sections![section]
        return sectionInfo.numberOfObjects
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ContactCell", for: indexPath) as? PersonsCell

        let contact = fetchedResultsController.object(at: indexPath)
        cell.contact = contact

        return cell!
    }
}