2012-01-03 70 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屬性(但所有的其他財產,因爲我與故事板的爛攤子之前創建它們)。 所以,如果你想在你的項目中複製一些老班級,請在你的工作中注意。