2016-04-22 1 views
1

Je suis nouveau chez swift et j'essaie de faire une application avec CoreData, mais le prédicat ne me montre pas les bons résultats. Il semble que le programme ignore le prédicat, car sans le prédicat, il montre les mêmes choses. Voici mon code:Coredata fetchrequest prédicat ne montre pas les bonnes choses

import UIKit 

class UebungenAnzeigenTableViewController: UITableViewController { 

var mgdContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

var uebungen = [Uebung]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if let uvc = segue.destinationViewController as? UebungenAnzeigenViewController { 
     if let identifier = segue.identifier{ 
      switch identifier{ 
       case "Brust": 
        let request = NSFetchRequest(entityName: "Uebung") 

        request.predicate = NSPredicate(format: "muskel == %@", "Brust") 
        do{ 
         try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung] 
        } 
        catch{ 
          print("Abfrage fehlgeschlagen!") 
        } 
       case "Ruecken": 
        break 
       case "Beine": 
        break 
       case "Schulter": 
        break 
       case "Bizeps": 
        break 
       case "Trizeps": 
        break 
       case "Nacken": 
        break 
       case "Unterarm": 
        break 
      default: 
       break 
      } 
     } 
    } 
} 
} 

Voici l'endroit où les exercices doivent être affichés:

import UIKit 

class UebungenAnzeigenViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

var mgdContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
@IBOutlet weak var tableView: UITableView! 

var uebungen = [Uebung](){ 
    didSet{ 
     self.tableView.reloadData() 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadUebungen() 

} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("UebungCell", forIndexPath: indexPath) 
    let uebung = uebungen[indexPath.row] 
    cell.textLabel!.text = uebung.name! 
    cell.textLabel?.textAlignment = .Center 
    return cell 
} 

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

func loadUebungen(){ 
    let request = NSFetchRequest(entityName: "Uebung") 
    do{ 
     try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung] 
    } 
    catch{ 
     print(error) 
    } 

} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "neueUebung" { 
     let ctrl = segue.destinationViewController as! UebungSaveViewController 
     ctrl.saveDelegate = { 
      (newUebung, newMuskelgruppe) in 

      let neueUebung = NSEntityDescription.insertNewObjectForEntityForName("Uebung", inManagedObjectContext: self.mgdContext) as! Uebung 
      neueUebung.name = newUebung 
      neueUebung.muskel = newMuskelgruppe 

      do{ 
       try self.mgdContext.save() 
      } 
      catch{ 
       print("speichern fehlgeschlagen") 
      } 
      self.loadUebungen() 
      self.navigationController?.popViewControllerAnimated(true) 
     } 
    } 
} 

}

.. Et là, je l'ai sauvé les exercices:

import UIKit 

class UebungSaveViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{ 

var muskelgruppen = ["Brust", "Rücken", "Beine", "Schultern", "Bizeps", "Trizeps", "Nacken", "Unterarme"] 
var saveDelegate: ((String, String) ->())? 
var selectedMuskelgruppe = "Brust" 

@IBOutlet weak var pickerView: UIPickerView! 

@IBOutlet weak var nameTextField: UITextField! 

@IBAction func saveUebungAction(sender: UIButton) { 
    let neueUebung = nameTextField.text 
    if saveDelegate != nil && neueUebung != nil { 

     saveDelegate!(neueUebung!, selectedMuskelgruppe) 

     } 
    } 


override func viewDidLoad() { 
    super.viewDidLoad() 
    self.pickerView.dataSource = self 
    self.pickerView.delegate = self 
    self.hideKeyboardWhenTappedAround() 
} 

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
    return muskelgruppen.count 
} 

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    return muskelgruppen[row] 
} 

func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
    return 1 
} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    switch row{ 
     case 0: 
      selectedMuskelgruppe = "Brust" 
     case 1: 
      selectedMuskelgruppe = "Rücken" 
     case 2: 
      selectedMuskelgruppe = "Beine" 
     case 3: 
      selectedMuskelgruppe = "Schultern" 
     case 4: 
      selectedMuskelgruppe = "Bizeps" 
     case 5: 
      selectedMuskelgruppe = "Trizeps" 
     case 6: 
      selectedMuskelgruppe = "Nacken" 
     case 7: 
      selectedMuskelgruppe = "Unterarm" 
    default: 
     break 
    } 
} 
} 

Quelqu'un peut-il nous dire pourquoi cela ne fonctionne pas? Je suis nouveau dans rapide et j'ai essayé beaucoup de choses, mais je ne comprends pas ..

Répondre

1

C'est parce que vous ne semblez pas avoir un prédicat:

func loadUebungen(){ 
    let request = NSFetchRequest(entityName: "Uebung") 
    do{ 
     try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung] 
    } 
    catch{ 
     print(error) 
    } 
} 

Si vous avez un prédicat est déconnecté du code qui remplit réellement la table, ainsi vous obtenez une liste filtrée et ne faites rien avec elle dans la méthode segue (dans le contrôleur précédent) mais sans appliquer un prédicat où vous en avez réellement besoin (dans loadUebungen).

+0

Oui, maintenant ça marche! Je vous remercie! –