Управляемая ошибка передачи объекта в target-c - PullRequest
0 голосов
/ 03 января 2012

У меня есть этот managedContextObject, который я хочу передать от контроллера представления другому. Из контроллера представления с именем CatalogueViewController это работает без проблем. И это код без проблем:

- (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; не имеет проблем.

НО! Когда я пытаюсь передать SAME THING в 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: ошибка: семантическая проблема: Свойство managedObjectContext не найдено для объекта типа «DetailsItemViewController *»

это явно не так!

ПОЧЕМУ?!

Просто чтобы быть яснее:

Я делаю # import 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

1 Ответ

0 голосов
/ 04 февраля 2012

Только что решил проблему! Ну, это было не просто. Случилось так, что несколькими днями ранее мне пришлось переделать проект (потому что я случайно стер раскадровку), и поэтому я добавил несколько классов из старого в новый проект с тем же именем. Проблема в том, что Xcode тасует все классы в другой папке, поэтому у меня был некоторый скопированный класс в новой папке проекта и другой более старый класс в подпапке. Это заставляет меня иметь класс с тем же именем здесь и там, но с другим кодом. Итак, даже если в Xcode IDE у меня был новый detailsViewController WITH managedContextObject, CartViewController ссылался на старую версию detailsViewController, у которой нет свойства managedContextObject (но есть все остальные свойства, потому что я создал их до беспорядка с раскадровкой ). Поэтому, если вы хотите скопировать какой-то старый класс в своем проекте, уделите много внимания тому, что вы делаете.

...