2012-01-03 5 views
0

私はこのmanagedContextObjectを持っています。View Controllerから別のControllerに渡したいと思います。 CatalogueViewControllerと呼ばれるビューコントローラから、これは問題なく正常に動作します。そして、これは無問題のコードです:managedContextObjectはobjective-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!私は同じdetailsItemViewController同じことを通過しようとする(唯一の違いは、私はCartViewControllerと呼ばれる別のビューコントローラからそれを行うことである)、これはコードである:detailsItemViewController:線上

- (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]; 

    } 
} 

.managedObjectContext = self.managedObjectContext; Xcodeからこのエラーメッセージが表示されます:

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

明らかにそうではありません!

なぜですか?

ただ、明確にすべき:

私はCartViewControllerでDetailsItemViewController.hの#importを作る:

#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を。の作業。このすべての行は全く問題なく動作します:私は別のdetailsItemViewControllerのプロパティをピックアップしてみた場合

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

実際には、例えば、それがうまく機能します!私が行う場合にのみ 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

+0

うん、これは私の問題を解決しませんが、これは知っていると非常に便利です!ありがとうございました。私はそれについて考えませんでした^^ – iLeW

+0

DetailsItemViewControllerのヘッダをあなたの質問に含めることができますか? – jrturton

答えて

0

ただ、問題を解決しました! これは単純なものではありませんでした。数日前に私はプロジェクトをやり直さなければならなかったので(私は誤ってストーリーボードを消してしまったので)、古いものから新しい名前のプロジェクトにいくつかのクラスを追加しました。問題は、Xcodeが別のフォルダ内のすべてのクラスをシャッフルするので、新しいプロジェクトフォルダとサブフォルダ内の他の古いクラスにコピーされたクラスがいくつかあることです。これは、私が同じ名前のクラスを別々のコードでここにも持つことになります。ですから、Xcode IDEに新しいdetailsViewController with managedContextObjectがあった場合でも、CartViewControllerはmanagedContextObjectプロパティを持たないdetailsViewControllerの古いバージョンを参照していました(ただし、ストーリーボードの混乱の前にそれらを作成したので、 )。 プロジェクトの古いクラスをコピーしたい場合は、自分がやっていることに多くの注意を払う必要があります。

関連する問題