1

在尝试将 managedObjectContext 分发到视图控制器时,我收到该错误:在“UIViewController *”类型的对象上找不到属性“managedObjectContext” AppDelegate.m 中的此代码是错误的根源:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *searchController = [[SearchCriteriaViewController alloc] initWithNibName:@"SearchCriteriaViewController" bundle:nil];
    UIViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];

    managementController.managedObjectContext = self.managedObjectContext;

WineManagementViewController 中的代码如下所示:

@interface WineManagementViewController : UIViewController <NSFetchedResultsControllerDelegate>
{
    IBOutlet UIButton *countryButton;
    WineStore *store;
}

- (IBAction)newCountry:(id)sender;

@property (strong, nonatomic) UIPopoverController *poCtrl;
@property (strong, nonatomic) WineStore *store;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;

这是实施的开始:

@implementation WineManagementViewController
@synthesize store, managedObjectContext;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...

如果我想以这种方式访问​​该属性,或者如果我想使用 setter 方法访问它,则找不到该属性。有谁知道为什么找不到这个属性?

4

2 回答 2

1

应该:

WineManagementViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];
于 2013-01-27T12:02:21.440 回答
0

使用点语法的好处是它做了更多的类型检查。

你所做的就是将你的新 managementController 对象声明为 aUIViewController而不是它的实际类型WineManagementViewController。这在里氏替换原则下是完全有效的。

但是 - 您正在使用点语法来设置属性值,并且编译器看不到该对象实际上是一个WineManagementViewController对象而不是一个UIViewController没有 managedObjectContext 属性的对象。

这就是 using 方法发送语法可以帮助您的地方。如果您保留声明,那么您编写代码就没有问题,例如:

UIViewController *managementController = [[WineManagementViewController alloc] initWithNibName:@"WineManagementViewController" bundle:nil];

[managementController setManagedObjectContext:self.managedObjectContext];

因为使用方法发送语法不会进行相同的类型检查。它会在运行时愉快地向对象发送消息,如果方法没有实现,那么它会抛出异常。

所以; 您所做的并没有错,只是编译器很挑剔。

于 2013-01-27T12:10:11.033 回答