2016-04-16 9 views
0

現在、2つのエンティティの情報を保持するインベントリアプリケーションに取り組んでいます。第1のエンティティは、2つの属性「サイト名」および「サイトアドレス」を保持する。第2のエンティティは、「itemName」「itemQuantity」および「item picture」を保持する。データをコアデータに保存することができます。今すぐデータを取得する際に問題があります。どのようにView Controller間でデータを渡すかは、誰にも分かります。ビュー間でコアデータを渡す

サイトビューコントローラ、ディテールビューコントローラ、および新しいアイテムビューコントローラをアップロードしています。ここ

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! 

     } 

    } 

} 

私の詳細ビューコントローラは

輸入のUIKit インポートCoreData

プロパティpublic var fetchSiteです:NSManagedObject?

クラス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 


} 

}

これはにデータを保存するために私の最後の図です。私は、ここでデータを渡して、2つのエンティティを関連付けて、正しく保存できるようにする必要があると考えました。たとえば、サイト名「Staples Center」の場合。私はこれを最後のView Controllerに引き渡し、このオブジェクトに情報を保存する必要があります。

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) 

    } 

    } 


} 

もう一度誰かがコアデータへの私の関係を保存し、素晴らしいことだこれらの関係を取得するための正しい方向に私を指すことができます。まだコアデータに新しいので、私は得ることができるすべてのヘルプが必要!

+0

コードが多すぎます。質問に関連すると思われるものだけを減らしてください。 – Mundi

答えて

0

あなたの詳細コントローラがプロパティSiteを持つことができ、ありがとうございました。 prepareForSegueでは、選択したSiteオブジェクトを詳細コントローラに渡します。

サイトリストとアイテムリストの両方は、メモリ内配列ではなくNSFetchedResultsControllerでバックアップされている必要があります。

+0

私は両方をNSFetchedresultsControllerとして作った。どのようにコアデータオブジェクトをNSFetchedResultsControllerに渡し、渡されたNSManagedobject項目を2番目のビューにフェッチして表示しますか?最初のビューコントローラから2番目のビューコントローラに関係を表示する必要があるため、問題が発生しています。 – rickGrimes88

+0

説明どおりに行います。 (プロパティ、prepareForSegue)。 – Mundi

関連する問題