我怎样才能找到我的财产?

时间:2013-01-27 12:00:23

标签: ios objective-c

在尝试将我的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方法访问它,则无法找到该属性。有谁知道为什么找不到这个属性?

2 个答案:

答案 0 :(得分:1)

应该是:

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

答案 1 :(得分:0)

使用点语法的方法是它进行更多的类型检查。

您所做的是将新的managementController对象声明为UIViewController,而不是它的实际类型WineManagementViewController。根据Liskov Substitution原则,这完全有效。

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

这是使用方法发送语法可以帮助您的地方。如果您保留声明,那么您可以编写代码,例如:

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

[managementController setManagedObjectContext:self.managedObjectContext];

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

因此;你正在做的事情没有错,只是编译器挑剔。