2017-06-08 5 views
0

Ich habe eine nstableview, die ich mit Daten von Kerndaten fülle.Kerndaten nstableview searchbar

NSManagedObject

import Foundation 
import CoreData 

@objc(Person) 
public class Person: NSManagedObject { 
    @NSManaged public var firstName: String 
    @NSManaged public var secondName: String 
} 

Request

func requestData() { 
     let appdelegate = NSApplication.shared().delegate as! AppDelegate 
     let context = appdelegate.persistentContainer.viewContext 
     let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Person") 

     do { 
      person = try context.fetch(request) as! [Person] 
      tableViewn.reloadData() 
     } catch { } 
    } 

ich habe auch eine benutzerdefinierte Zelle Ansicht für meine Tableview. Ich fülle die Daten wie folgt aus:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 

     let view = tableView.make(withIdentifier: "Cell", owner: self) as? CustomCell 

     view?.txtfirstName.stringValue = person.firstName 
     view?.txtsecondName.stringValue = person.secondName 
     return view 
} 

Nun möchte ich eine searchbar verwirklichen möchte (was ich bereits in meiner Ansicht-Controller haben) für mit ersten oder zweiten Namen suchen.

aber ich habe keine Ahnung, wie ich das realisieren kann.

+0

Wie haben Sie die Suchleiste implementiert, was sollte wann geschehen und was haben Sie versucht? – Willeke

+0

Wenn Sie 'NSSearchField' und' NSArrayController' verwenden, binden Sie das/die Prädikat (e) des Suchfelds an das Filterprädikat des Array-Controllers. Keine Codierung erforderlich. – Willeke

Antwort

0
  • die Delegierten des NSSearchField zu der Zielklasse
  • controlTextDidChange

    override func controlTextDidChange(_ notification: Notification) { 
        if let field = notification.object as? NSSearchField { 
         let query = field.stringValue 
         let predicate : NSPredicate? 
         if query.isEmpty { 
          predicate = nil 
         } else { 
          predicate = NSPredicate(format: "firstName contains[cd] %@ OR lastName contains[cd] %@", query, query) 
         } 
         requestData(with: predicate) 
        } else { 
         super.controlTextDidChange(notification) 
        } 
    } 
    
  • ändern requestData zu

    func requestData(with predicate : NSPredicate? = nil) { 
        let appdelegate = NSApplication.shared().delegate as! AppDelegate 
        let context = appdelegate.persistentContainer.viewContext 
        let request = NSFetchRequest<Person>(entityName: "Person") 
        request.predicate = predicate 
    
        do { 
         person = try context.fetch(request) 
         tableViewn.reloadData() 
        } catch { } 
    } 
    

Exkurs implementieren Set:

Wenn Sie Unterklassen verwenden, erstellen Sie die Abrufanforderung spezifischer NSFetchRequest<Person>(entityName... statt NSFetchRequest<NSFetchRequestResult>(entityName..., die den Typ in der Abrufzeile umgewandelt vermeidet.

+0

perfekt !! ich danke dir sehr :) – Ghost108