2012-01-03 68 views
0

我有这样managedContextObject我想从一个视图控制器传递到另一个。从称为CatalogueViewController的视图控制器,这工作正常,没有问题。并且这是无问题的代码:managedContextObject传递误差在目标c

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"AddItem"]) { 

     UINavigationController *navigationController = segue.destinationViewController; 
     DetailsItemViewController *detailsItemViewController = (DetailsItemViewController *) navigationController.topViewController; 
     detailsItemViewController.delegate = self; 
     detailsItemViewController.productToAdd = sender; //Mando il prodotto che ha provocato la segue (fatto manulamente sopra in didSelectRowAtIndexPath). 
     detailsItemViewController.index = [prodotti.productsArray indexOfObject:sender]; 
     detailsItemViewController.managedObjectContext = self.managedObjectContext; //Gli passo anche l'oggetto per registrare i prodotti aggiunti in core data. 
     NSLog(@"::::::::::::INDICE DELL'OGGETTO: %d", [prodotti.productsArray indexOfObject:sender]); 

     //delegato, vado ad aggiungere i metodi delegati 

    } 
} 

和行detailsItemViewController.managedObjectContext = self.managedObjectContext;没有问题。

BUT!当我尝试SAME THING传递给THE SAME detailsItemViewController(唯一的区别是,我这样做,从称为CartViewController另一个视图控制器),并且这是代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"EditItem"]) { 

     UINavigationController *navigationController = segue.destinationViewController; 
     DetailsItemViewController *detailsItemViewController = (DetailsItemViewController *) navigationController.topViewController; 
     detailsItemViewController.productToEdit = sender; //Mando il prodotto che ha provocato la segue (fatto manulamente sopra in didSelectRowAtIndexPath. 
     detailsItemViewController.managedObjectContext = self.managedObjectContext; //Gli passo anche l'oggetto per registrare i prodotti aggiunti in core data. 

     //Mi metto in ascolto di una notifica tramite il Notification Center. 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(objectEditedFromDetailsViewController:) 
                name:@"ObjectEdited" 
                object:nil]; 

    } 
} 

就行:detailsItemViewController .managedObjectContext = self.managedObjectContext; Xcode给我这个错误信息:

[...]CartViewController.m: error: Semantic Issue: Property 'managedObjectContext' not found on object of type 'DetailsItemViewController *'

那显然是不正确的!

WHY?

只是为了更清楚:

我做DetailsItemViewController.h的CartViewController的#进口:

#import "CartViewController.h" 
#import "Product.h" 
#import "CartCell.h" 
#import "CDProduct.h" 
#import "DetailsItemViewController.h" 
#import "UIImage+Resize.h" 


@implementation CartViewController { 

所有行,但detailsItemViewController.managedObjectContext = self.managedObjectContext;工作。所有这些线路没有问题,在所有的工作:

UINavigationController *navigationController = segue.destinationViewController; // <---- WORKS 
DetailsItemViewController *detailsItemViewController = (DetailsItemViewController *) navigationController.topViewController; // <---- WORKS 
detailsItemViewController.productToEdit = sender; // <---- WORKS 

事实上,举例来说,如果我尝试拿起另一detailsItemViewController的属性效果很好!只有当我做 detailsItemViewController.managedObjectContext = self.managedObjectContext;我从Xcode得到错误。

而这里DetailsItemViewController.h

#import <UIKit/UIKit.h> 
#import "Product.h" 
#import "ProductDetails.h" 
#import "CDProduct.h" 


//Delegato per lo screen successivo di aggiunta roba nel carrello. 
@class DetailsItemViewController; 
@class CatalogueItem; 

@protocol DetailsItemViewControllerDelegate <NSObject> 

- (void)detailsViewControllerDidCancel:(DetailsItemViewController *)controller; 
- (void)detailsViewControllerDidDone:(DetailsItemViewController *)controller didFinishAddingItem:(CatalogueItem *)item; 

@end 


//@class Product; 
//@class ProductDetails; 

@interface DetailsItemViewController : UIViewController <NSURLConnectionDelegate> 

@property (nonatomic, weak) id <DetailsItemViewControllerDelegate> delegate; 

@property (nonatomic, strong) Product *productToAdd; //Li differenzio così capisco quello che devo fare. NB: per chi legge questo codice:productToAdd non indica un oggetto da aggiungere ma un oggetto a cui si può modificare la quantità per aggiungerlo al carrello. 
@property (nonatomic, strong) CDProduct *productToEdit; 

@property (nonatomic, strong) ProductDetails *productToShow; //Qui ci metto il prodotto che ricavo da loadProducts. 

@property (strong, nonatomic) IBOutlet UIImageView *graphicImage; 
@property (strong, nonatomic) IBOutlet UIImageView *overviewImage; 
@property (strong, nonatomic) IBOutlet UIStepper *stepper; 
@property (strong, nonatomic) IBOutlet UILabel *stepperValueLabel; 
@property (strong, nonatomic) IBOutlet UILabel *productNameLabel; 
@property (strong, nonatomic) IBOutlet UILabel *priceLabel; //Il prezzo poi lo prendo facendo il parsing di un altra pagina. 
@property (strong, nonatomic) IBOutlet UILabel *totalPrice; 

@property (nonatomic, assign) int index; //In questa property ci metto l'indice dell'oggetto passato (productToAdd) in modo sapere che articolo dell'XML parsare. 

@property (nonatomic, strong) NSMutableData *receivedData; 

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; //Per registrare i prodotti in core data. 


- (IBAction)cancel; 
- (IBAction)done; 
- (IBAction)changeValue:(UIStepper *)sender; 

@end 
+0

不能解决你的问题,但如果'productToEdit'是NSManagedObject(或子类),那么它已经包含到托管对象上下文的引用,所以你并不需要单独通过它('productToEdit.managedObjectContext' )。 – jrturton 2012-01-03 14:43:32

+0

是的,这并没有解决我的问题,但这是非常有用的知道!非常感谢你,我没有想过^^ – iLeW 2012-01-03 14:53:06

+0

你可以在你的问题中包含DetailsItemViewController的头文件吗? – jrturton 2012-01-03 15:08:19

回答

0

就解决了这个问题! 嗯,这不是一个简单的。事情发生在几天前我不得不重做这个项目(因为我不小心擦掉了故事板),所以我添加了一些从旧的到新的同名项目的类。问题是Xcode洗牌不同文件夹中的所有类,所以我在新的项目文件夹和子文件夹中的其他旧类中复制了一些类。这导致我在这里和那里有相同的名字,但代码不同。因此,即使在Xcode IDE我有了新的detailsViewController WITH managedContextObject的CartViewController指的是旧版本detailsViewController的有没有managedContextObject属性(但所有的其他财产,因为我与故事板的烂摊子之前创建它们)。 所以,如果你想在你的项目中复制一些老班级,请在你的工作中注意。