2016-04-19 6 views
0

Ich bin derzeit lernen und eine grundlegende Entscheidung App erstellen. Die Grundlagen der App bestehen darin, Benutzereingaben für eine Kategorie zu machen, die sie machen möchten, und dann alle Dinge, mit denen diese Kategorie gefüllt werden soll.So nehmen Sie Core Data und filtern Sie es mit NSPredicate Swift

Jetzt möchte ich die Ergebnisse auf einer Tabellenansicht anzeigen, die funktioniert, aber ich auch, was auf jede einzelne Kategorie, die sie kürzlich verwendet haben, zu klicken und in der Lage sein, die Dinge zu sehen, die sie unter jeder Kategorie platziert. Ich habe alles, was in den Core Data gespeichert war, bekommen, aber jetzt versuche ich, mit NSPredate herauszufiltern, was ich brauche. Wenn ich die App starte, gibt es nichts in der Tabellenansicht.

mainName Ich habe von einem anderen View-Controller übergeben, um zu erfassen und festzulegen, was der Name der Kategorie war, um die Daten zu filtern. Ich habe versucht, es im Prädikat als Filter zu verwenden.

Ich weiß nicht, ob das, was ich tue, richtig ist, aber Hilfe wäre großartig. Dies ist ein unabhängiges Studienprojekt, das ich mache, um meinen Abschluss zu machen und alles, was ich weiß, ist Autodidakt. Wenn das, was ich habe, völlig falsch ist, sag es mir bitte. Dies ist nur eine von Hunderten von verschiedenen Möglichkeiten, wie ich versucht habe, dies richtig zu machen.

@IBOutlet weak var tableview: UITableView! 


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


} 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell 

    let Doing = whats[indexPath.row] 
    cell.textLabel!.text = Doing.valueForKey("what") as? String 


    return cell 
} 

func loadData(){ 


    let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate 

    if let context = appDelegate?.managedObjectContext{ 

     let fetchRequest = NSFetchRequest(entityName: "Doing") 
     let namePredicate = NSPredicate(format: "namesR.noun = '\(mainName)'") 
     (whats as NSArray).filteredArrayUsingPredicate(namePredicate) 
     fetchRequest.predicate = namePredicate 
     do { 
      let results = 
       try context.executeFetchRequest(fetchRequest) 
      whats = results as! [NSManagedObject] 
     } catch let error as NSError { 
      print("Could not fetch \(error), \(error.userInfo)") 
     } 
    } 
} 

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

} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadData() 
} 

Antwort

0

Von meinem Verständnis, Sie sagen, Sie für jede Kategorie eine Kategorie Einheit und ein Element Einheit mit vielen Artikeln haben. In diesem Fall müssen Sie im View-Controller, auf dem Sie die Items anzeigen möchten, eine Category-Variable für Ihr Prädikat verwenden, damit Sie nur die mit dieser Kategorie verknüpften Items abrufen können.

class ItemsTableVC { 

    var category: Category! 

    lazy var fetchedResultsController: NSFetchedResultsController = { 
     let fetchRequest = NSFetchRequest(entityName: "Item") 
     fetchRequest.sortDescriptors = [] 
     fetchRequest.predicate = NSPredicate(format: "category == %@", self.category) 
     let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.sharedContext, sectionNameKeyPath: nil, cacheName: nil) 
     fetchedResultsController.delegate = self 
     return fetchedResultsController 
    }() 

} 
+0

Es gibt mir einen Fehler auf dem self.sharedContext warum würde das sein ?? Es besagt, dass im VC kein Mitglied 'sharedContext' vorhanden ist. – NSchaffer428

+0

Ersetzen Sie 'self.sharedContext' durch' self.context', das sich auf den Kontext bezieht, den Sie in Ihrem Code deklariert haben. Oder 'let context = UIApplication.sharedApplication(). Delegate.sharedManagedObject' – MikaelM

+0

In Ordnung jetzt sagt es, dass UIApplication nicht sharedApplication(), auch wenn ich let context = UIApplication.sharedApplication() verwenden. SharedManagedObject – NSchaffer428