2016-04-16 8 views
0

Ich arbeite derzeit an einer Inventar App, die Informationen für zwei Entitäten enthalten wird. Die erste Entität enthält zwei Attribute "Site-Name" und "Site-Adresse". Die zweite Entität enthält "itemName" "itemQuantity" und "item picture". Ich kann die Daten in den Kerndaten speichern. Ich habe gerade Probleme mit dem Abrufen der Daten. Kann jemand Daten zwischen den View-Controllern übertragen?übergeben Kerndaten zwischen Ansichten swift

Ich lade den Site View-Controller, den Detailansicht-Controller und meinen neuen Elementansicht-Controller hoch.

class SiteTableViewController: UIViewController { 


    var managedContext : NSManagedObjectContext = CoreDataHelper.sharedInstance.myContext 
    var sites : [Site]? = [Site]() 

    //variable to hold selected site 
    var selectedSite : Site? 

    let myCellIdentifier = "cell" 



    @IBOutlet weak var tableView: UITableView! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.delegate = self 
     tableView.dataSource = self 

     // Do any additional setup after loading the view. 
     sites = [Site]() 
     reloadData() 

     automaticallyAdjustsScrollViewInsets = false 


     //let barButtonItem = UIBarButtonItem(barButtonSystemItem: .Compose, target: self, action: "addSite:") 
     //self.navigationItem.leftBarButtonItems = [barButtonItem] 
    } 




    //load new data into table 
    func reloadData() { 

     let fetchRequest = NSFetchRequest(entityName: "Site") 
     let sortDescriptor = NSSortDescriptor(key: "siteName", ascending: true) 

     fetchRequest.sortDescriptors = [sortDescriptor] 

     do { 
      sites = try self.managedContext.executeFetchRequest(fetchRequest) as! [Site] 
      tableView.reloadData() 

     } catch { 

      print("Error fetching objects") 

     } 
     tableView.reloadData() 


    } 



    override func viewWillAppear(animated: Bool) { 

     reloadData() 

    } 



} 

extension SiteTableViewController: UITableViewDataSource, UITableViewDelegate { 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier(myCellIdentifier, forIndexPath: indexPath) 

     let site = sites![indexPath.row] 

     cell.textLabel?.text = site.valueForKey("siteName") as? String 
     cell.detailTextLabel?.text = site.valueForKey("siteAddress") as? String 

     return cell 
    } 

    func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 

     return true 
    } 

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 

     if editingStyle == .Delete { 

     let logItemToDelete = sites![indexPath.row] 
     sites?.removeAtIndex(indexPath.row) 
     managedContext.deleteObject(logItemToDelete) 

      do { 

       try managedContext.save() 

      } catch { 

       print("Could not save or delete object") 
      } 

      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
     } 

    } 





    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return sites!.count 

    } 

// func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
//   
//  selectedSite = sites![indexPath.row] 
//   
// } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

     if segue.identifier == "detailSegue" { 

      var nextVC = segue.destinationViewController as! DetailTableViewController 
      var selectedItem : Site = sites![self.tableView.indexPathForSelectedRow!.row] as Site 

      fetchSite = selectedItem.valueForKey("siteName") as? NSManagedObject 
      nextVC.valueToPass = selectedItem.siteName! 

     } 

    } 

} 

hier ist meine Detailansicht Controller

Import UIKit Import Coredata

public var fetchSite: NSManagedObject?

Klasse DetailTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var holdSiteData: NSMutableArray = NSMutableArray() 
var managedContext : NSManagedObjectContext = CoreDataHelper.sharedInstance.myContext 


@IBOutlet weak var tableView: UITableView! 


var sites : [Site]! 


//string to hold fetchResults controll 



//open string to hold siteName 
var valueToPass = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.navigationItem.title = "\(valueToPass)" 

    // Do any additional setup after loading the view. 

    tableView.delegate = self 
    tableView.dataSource = self 

    automaticallyAdjustsScrollViewInsets = false 
    tableView.estimatedRowHeight = 75.0 
    tableView.rowHeight = UITableViewAutomaticDimension 

    retrieveItemRelationship() 

} 

override func viewWillAppear(animated: Bool) { 

    retrieveItemRelationship() 
} 



func retrieveItemRelationship() { 

    // fetchSite.setValue(NSSet(keyCommands), forKey: "test") 
    let fetchRequest = NSFetchRequest(entityName: "SiteItem") 
    let sortDescriptors = NSSortDescriptor(key: "itemName", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptors] 

    do { 

     let result = try fetchSite?.managedObjectContext?.executeRequest(fetchRequest) 


    } catch let error as NSError { 

     print(error) 
    } 


} 





func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 

// let cellInfo = fetchedResultsController.objectAtIndexPath(indexPath) as! SiteInfo 



    cell.cellName?.text = "Test" 




    return cell 
} 



func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return holdSiteData.count 


} 

}

dies meine letzte Ansicht ist, um die Daten zu speichern. Ich dachte, ich muss die Daten hier übergeben und dann die beiden Entitäten zuordnen, damit ich sie richtig speichern kann. Zum Beispiel für den Site-Namen "Staples Center". Ich muss dies zum letzten View-Controller ziehen und dann die Informationen zu diesem Objekt speichern.

import UIKit 
import CoreData 

class ItemNewViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    //var managedObjectContext : NSManagedObjectContext! 

    var managedContext : NSManagedObjectContext = CoreDataHelper.sharedInstance.myContext 


    //categories array for picker view 
    var categories = ["Building Materials", "Electrical", "Cleaning Products", 
     "Tools & Hardware", "Plumbing", "Paint", "Appliances", "Other"] 

    //textFields 

    @IBOutlet weak var itemNameTextField: UITextField! 
    @IBOutlet weak var quantityTextField: UITextField! 



    @IBOutlet weak var imageView: UIImageView! 


    //Label properties 
    @IBOutlet weak var newItemLabel: UILabel! 
    @IBOutlet weak var quantityLabel: UILabel! 
    @IBOutlet weak var categoryLabel: UILabel! 


    //pickerLabel 
    @IBOutlet weak var pickerListIcon: UIPickerView! 



    //clicker property label and textlabel for number 
    @IBOutlet weak var increaseNumberClicker: UIStepper! 
    @IBOutlet weak var numberFieldClicker: UITextField! 




    override func viewDidLoad() { 
     super.viewDidLoad() 

     //label property customize view code 
     newItemLabel.layer.masksToBounds = true 
     newItemLabel.layer.borderWidth = 2.0 
     newItemLabel.layer.borderColor = UIColor.whiteColor().CGColor 
     newItemLabel.layer.cornerRadius = 6 

     //label property customize view code 
     quantityLabel.layer.masksToBounds = true 
     quantityLabel.layer.borderWidth = 2.0 
     quantityLabel.layer.borderColor = UIColor.whiteColor().CGColor 
     quantityLabel.layer.cornerRadius = 6 

     //lable property customize view code 
     categoryLabel.layer.masksToBounds = true 
     categoryLabel.layer.borderWidth = 3.0 
     categoryLabel.layer.borderColor = UIColor.whiteColor().CGColor 
     categoryLabel.layer.cornerRadius = 6 

     //label picker customize view 
     pickerListIcon.layer.masksToBounds = true 
     pickerListIcon.layer.borderWidth = 3.0 
     pickerListIcon.layer.borderColor = UIColor.whiteColor().CGColor 
     pickerListIcon.layer.cornerRadius = 6 
     pickerListIcon.layer.backgroundColor = UIColor.blackColor().CGColor 



     self.pickerListIcon.dataSource = self 
     self.pickerListIcon.delegate = self 


     numberFieldClicker.enabled = false 


     //UIStepper value 
     increaseNumberClicker.wraps = true 
     increaseNumberClicker.autorepeat = true 
     increaseNumberClicker.layer.masksToBounds = true 
     increaseNumberClicker.layer.borderWidth = 3.0 
     increaseNumberClicker.layer.borderColor = UIColor.whiteColor().CGColor 
     increaseNumberClicker.layer.cornerRadius = 6 
     increaseNumberClicker.layer.backgroundColor = UIColor.blackColor().CGColor 



     //below code declares a variable that inherits from UITapGesture 
     //this allows the image view to be an action 
     //*Make sure you enable user interaction in storyBoard very IMPORTANT! 
     let imageTapRecognizer = UITapGestureRecognizer(target: self, action: "enableImage") 

     self.imageView.addGestureRecognizer(imageTapRecognizer) 
    } 


    // below function allows the camera view to be accessible 
    func enableImage(){ 

     if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) { 

      let cameraView = UIImagePickerController() 
      cameraView.sourceType = UIImagePickerControllerSourceType.Camera 
      cameraView.delegate = self 

      self.presentViewController(cameraView, animated: true, completion: nil) 

     } 

    } 

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { 

     self.imageView.image = image 

     picker.dismissViewControllerAnimated(true, completion: nil) 
    } 



    //function used to increase UIStepper. increment by integers of one 
    @IBAction func clickerIncreaser(sender: UIStepper) { 



     numberFieldClicker.text = Int(sender.value).description 


    } 


    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 

     return 1 
    } 


    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 

     return categories.count 
    } 



    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 

     return categories[row] 
    } 


    func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? { 

     //passing the categorories array into the new constant myCategoriesArray 
     let myCategoriesArray = categories[row] 

     let myTextColor = NSAttributedString(string: myCategoriesArray, attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()]) 

     return myTextColor 
    } 


    //save data to core data 


    @IBAction func saveButton(sender: AnyObject) { 



     if (itemNameTextField.text?.isEmpty)! { 

     let displayAlertController = UIAlertController(title: "Form Incomplete", message: "Please provide item with a name", preferredStyle: .Alert) 


     let okButton : UIAlertAction = UIAlertAction(title: "OK", style: .Default, handler: nil) 

     displayAlertController.addAction(okButton) 

     self.presentViewController(displayAlertController, animated: true, completion: nil) 

     } else { 


     //declare site object and object 
     let siteInfoEntity = NSEntityDescription.entityForName("SiteItem", inManagedObjectContext: self.managedContext) 

     //declare item and item object 

     let siteObject = SiteItem(entity: siteInfoEntity!, insertIntoManagedObjectContext: self.managedContext) 

     //convert String to Integer 
     let quantityNumber: Int? = Int(quantityTextField.text!) 

     siteObject.setValue(itemNameTextField.text?.capitalizedString, forKey: "itemName") 
     siteObject.setValue(quantityNumber, forKey: "itemQnty") 

     fetchSite?.setValue(NSSet(object: siteObject), forKey: "reverseItems") 

     self.managedContext.saveOrLogError() 


     self.navigationController?.popViewControllerAnimated(true) 

    } 

    } 


} 

Noch einmal, wenn jemand mich in die richtige Richtung meine Beziehungen zu den Kerndaten zum Speichern und Abrufen dieser Beziehungen wäre toll verweisen. Noch neu zu den Kerndaten, also brauche ich alle Hilfe, die ich bekommen kann!

Danke

+0

Zu viel Code. Reduzieren Sie und zeigen Sie nur das an, was Ihrer Meinung nach für die Frage relevant ist. – Mundi

Antwort

0

Ihre Detail-Controller Site eine Eigenschaft haben kann. In prepareForSegue übergeben Sie das ausgewählte Objekt Site an den Detailcontroller.

Sowohl die Site-Liste als auch die Liste der Elemente sollten von NSFetchedResultsController unterstützt werden, keine In-Memory-Arrays.

+0

Ich habe beide als NSFetchedresultsControllers gemacht. Wie übergeben Sie Core-Datenobjekte an einen NSFetchedResultsController und holen Sie das übergebene NSManagedobject-Element zur zweiten Ansicht und zeigen Sie es an. Ich habe Probleme, weil ich die Beziehung auf dem zweiten View-Controller von den ersten View-Controllern zeigen muss. – rickGrimes88

+0

Tun Sie es genau wie beschrieben. (Eigentum, preparedForSegue). – Mundi

Verwandte Themen