【问题标题】:managedContextObject passing error in objective-cObjective-C中的托管上下文对象解析错误
【发布时间】:2012-01-03 14:35:31
【问题描述】:

我有这个 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 传递给 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:错误:语义问题:在“DetailsItemViewController *”类型的对象上找不到属性“managedObjectContext”

这显然不是真的!

为什么?!

为了更清楚:

我在 CartViewController 中 #import DetailsItemViewController.h:

#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

【问题讨论】:

  • 不能解决您的问题,但如果 productToEdit 是一个 NSManagedObject (或子类),那么它已经包含对您的托管对象上下文的引用,因此您不需要单独传递它( productToEdit.managedObjectContext).
  • 是的,这并不能解决我的问题,但是知道这一点非常有用!非常感谢大佬,我没想到^^
  • 能否在问题中包含 DetailsItemViewController 的标头?
  • CartViewController.m 中,检查detailsItemViewController 以确保它实际上是DetailsItemViewController 的对象。 NSLog(@"%@", detailsItemViewController) 应该告诉你它实际上是什么。
  • 用你如何解决问题来回答你的问题,几天后你就能接受你的答案了。

标签: objective-c xcode4.2 nsmanagedobjectcontext ios5


【解决方案1】:

刚刚解决了问题! 嗯,这不是一个简单的。碰巧几天前我不得不重做这个项目(因为我不小心删除了情节提要),所以我将一些从旧的类添加到新的同名项目中。问题是 Xcode 对不同文件夹中的所有类进行了洗牌,所以我在新项目文件夹中有一些复制的类,而在子文件夹中有其他旧类。这导致我在这里和那里有相同名称但代码不同的课程。因此,即使在 Xcode IDE 中我有带 managedContextObject 的新 detailsViewController,CartViewController 指的是没有 managedContextObject 属性的旧版本 detailsViewController(但具有所有其他属性,因为我在故事板混乱之前创建了它们)。 因此,如果您想在项目中复制一些较旧的类,请在您正在做的事情上多加注意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多