2015-06-14 10 views
8

WWDC2015 presentation video में बताया गया है नया Xcode7 में, हम सेट कर सकते हैं वस्तुओं Xcode मॉडल संपादक में सीधे विशिष्टता। मैं इसे अपना कोड लागू करने की कोशिश कर रहा था, लेकिन कुछ उम्मीद के अनुसार काम नहीं कर रहा है। जब मैं डुप्लिकेट वस्तु को बचाने की कोशिश, Xcode बचाने को खारिज कर दिया है, लेकिन डुप्लिकेट किए गए सेल के साथ तालिका अपडेट।iOS9 Xcode 7 - कोर डेटा - परहेज डुप्लिकेट वस्तुओं

तो मैं अद्वितीय विशेषताओं STARTDATE और ENDDATE निर्धारित किया है।

enter image description here

तब मैं अपने त्रुटि को संभालने और UIAlertController द्वारा उपयोगकर्ता को सूचित करने के लिए समारोह को बचाने के संशोधित किया है।

func addContract() { 
    do { 
     let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     let context: NSManagedObjectContext = appDelegate.managedObjectContext 

     let entity = NSEntityDescription.entityForName("Contract", inManagedObjectContext: context) 
     let newContractData = Contract(entity: entity!, insertIntoManagedObjectContext: context) 

     newContractData.startdate = dateFormatter.dateFromString(startDateTextField.text!)! 
     newContractData.enddate = dateFormatter.dateFromString(endDateTextField.text!)! 
     newContractData.ship = shipNameTextField.text! 
     newContractData.position = positionOnBoardTextField.text! 
     newContractData.workingdays = Int(workingDaysLabel.text!)! 

     try context.save() 
    } catch { 
     let alertController = UIAlertController(
      title: "Error", 
      message: "The contract exsist", 
      preferredStyle: UIAlertControllerStyle.Alert) 
     let okAction = UIAlertAction(
      title: "OK", 
      style: UIAlertActionStyle.Cancel, 
      handler: nil) 
     alertController.addAction(okAction) 
     presentViewController(alertController, animated: true, completion: nil) 
    } 
} 
अब तक

तो अच्छा है, लेकिन जब मैं रद्द बटन के साथ जड़ नियंत्रक के लिए वापस जाओ, टेबल डुप्लिकेट सेल के साथ अद्यतन प्रकट होता है।

@IBAction func cancelButtonPressed(sender: UIBarButtonItem) { 
    self.navigationController?.popToRootViewControllerAnimated(true) 
} 

इसके अतिरिक्त, एप्लिकेशन को रोकें और चलाएं डुप्लिकेट को हटा दें।

यहां समस्याग्रस्त व्यवहार के video है।

Error Domain=NSCocoaErrorDomain Code=1551 "The operation couldn’t be completed. (Cocoa error 1551.)" UserInfo=0x7fc02d462190 {Conflicts=(
     { 
     constraint =   (
      startdate, 
      enddate 
     ); 
     entity = Contract; 
     objects =   (
      "<Contract: 0x7fc02d45ba60> (entity: Contract; id: 0x7fc02d019430 <x-coredata:///Contract/t0897571B-200B-4F04-AF87-D50831E2DE672> ; data: {\n enddate = \"2017-06-13 21:00:00 +0000\";\n position = test;\n ship = test;\n startdate = \"2016-06-13 21:00:00 +0000\";\n workingdays = 366;\n})", 
      "<Contract: 0x7fc02b7433c0> (entity: Contract; id: 0xd000000000100000 <x-coredata://C3318932-BEDB-4AB6-A856-103F542BCF44/Contract/p4> ; data: {\n enddate = \"2017-06-13 21:00:00 +0000\";\n position = test;\n ship = test;\n startdate = \"2016-06-13 21:00:00 +0000\";\n workingdays = 366;\n})" 
     ); 
    } 
)} 
2015-06-14 19:54:15.880 WorkingDays[6028:2219449] popToViewController:transition: called on <UINavigationController 0x7fc02c007e00> while an existing transition or presentation is occurring; the navigation stack will not be updated. 

addContract के संशोधन() ठीक करने के लिए समस्या का पालन है:

func addContract() { 
    let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDelegate.managedObjectContext 

    let entity = NSEntityDescription.entityForName("Contract", inManagedObjectContext: context) 
    let newContractData = Contract(entity: entity!, insertIntoManagedObjectContext: context) 
    do { 
     newContractData.startdate = dateFormatter.dateFromString(startDateTextField.text!)! 
     newContractData.enddate = dateFormatter.dateFromString(endDateTextField.text!)! 
     newContractData.ship = shipNameTextField.text! 
     newContractData.position = positionOnBoardTextField.text! 
     newContractData.workingdays = Int(workingDaysLabel.text!)! 

     try context.save() 

    } catch { 
     let alertController = UIAlertController(
      title: "Error", 
      message: "The contract exsist", 
      preferredStyle: UIAlertControllerStyle.Alert) 
     let okAction = UIAlertAction(
      title: "OK", 
      style: UIAlertActionStyle.Cancel, 
      handler: nil) 
     alertController.addAction(okAction) 
     presentViewController(alertController, animated: true, completion: nil) 

     context.deleteObject(newContractData) 
     print(error) 

    } 
} 
+1

यह केवल प्रासंगिक जानकारी दिखाने के लिए उपयोगी होगा। और वीडियो से, ऐसा लगता है कि आपको केवल एक ही चीज दिखाई देनी है जो निर्धारित करता है कि कौन सी विशेषता अद्वितीय है और कोर डेटा सबकुछ का ख्याल रखेगा। हम नहीं देख सकते कि आपने इन कोडों के साथ ऐसा किया है या नहीं। – Eendje

+0

उत्तर के लिए धन्यवाद। थोड़ा स्वार्थी कि कोई मुझे समस्या के साथ मदद करने के लिए पूरे कोड गर्त स्क्रॉल करेगा उम्मीद करना था। – nikolayDudrenov

उत्तर

5

आप एक NSFetchedResultsController उपयोग कर रहे हैं डेटा दिखाने के लिए

उत्पन्न त्रुटि के रूप में अनुवर्ती है?

ऐसा लगता है कि विशिष्टता सुनिश्चित किया जाता है केवल जब आप को बचाने के। लेकिन कोर डाटा अभी भी जब आप ऐसा करेंगे आप NSManagedObjectContext में ऑब्जेक्ट सम्मिलित करने की अनुमति देता है:

let newContractData = Contract(entity: entity!, insertIntoManagedObjectContext: context) 

जब आप को बचाने, संचालन को बचाने में विफल रहता है, लेकिन वस्तु के संदर्भ में अभी भी है, इसलिए NSFetchedResultsController अभी भी यह प्रदर्शित करता है।

अपनी पकड़ कोड में संदर्भ से वस्तु को दूर करने का प्रयास करें:

context.deleteObject(newContractData) 
+0

उत्तर के लिए धन्यवाद। मैंने उपर्युक्त कोशिश की, लेकिन काम नहीं कर रहा है। – nikolayDudrenov

+0

वास्तव में काम कर रहा है, लेकिन केवल { – nikolayDudrenov

+0

से पहले ऐपडिलेगेट, संदर्भ, इकाई और newContractData के लिए लाइन डालने के लिए यह सामान्य लगता है क्योंकि ऐसा करने और पकड़ने के दायरे अलग हैं। तो डच स्कोप में परिभाषित चर को पकड़ में नहीं देखा जा सकता है। आपने बाहरी दायरे में परिवर्तनीय घोषणा को स्थानांतरित करने वाली सही चीज़ की है – LombaX

संबंधित मुद्दे