I'm new at swift and I try to make an App with CoreData, but the predicate doesn't show me the right results. It seems like the program ignore the predicate, because without the predicate it shows the same things. Here is my Code:
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
}
}
}
}
}
Here is the place where the exercises should be displayed:
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)
}
}
}
}
.. And here I have saved the exercises:
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
}
}
}
Anyone an idea why this doesn't work? I'm new in swift and I tried many things but I don't get it..
That's because you don't appear to have a predicate:
func loadUebungen(){
let request = NSFetchRequest(entityName: "Uebung")
do{
try uebungen = mgdContext.executeFetchRequest(request) as! [Uebung]
}
catch{
print(error)
}
}
Where you do have a predicate is disconnected from the code which actually populates the table, so you're getting a filtered list and doing nothing with it in the segue method (in the previous view controller) but then not applying a predicate where you actually need it (in loadUebungen
).