在尝试将我的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方法访问它,则无法找到该属性。有谁知道为什么找不到这个属性?
答案 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];
因为使用方法发送语法不进行相同的类型检查。它会很乐意在运行时将消息发送到对象,如果方法没有实现,那么它将抛出异常。
因此;你正在做的事情没有错,只是编译器挑剔。