在iOS教程中,“window”未声明(在此函数中首次使用)错误

时间:2011-08-26 16:25:17

标签: ios xcode rootview

我正在尝试核心数据教程,我已经复制了Apple的Core Data教程中给出的代码:

http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/iPhoneCoreData01/Articles/02_RootViewController.html

它要求我们在实现应用程序委托后编译并运行。当我这样做时,Xcode 4编译器给出了这个错误“未声明的窗口(首次在此函数中使用)”。我可以看到有一个窗口声明为属性,代码中有一个合成行,如下所示:

@synthesize window = _window;

所以即使在程序中声明了一个window属性,为什么我会收到此错误?

以下是.h和.m文件:

·H:     #import

@interface LocationsAppDelegate : NSObject <UIApplicationDelegate> {
    UINavigationController *navigationController;

}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UINavigationController *navigationController;

@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

@end

现在是.m文件:

#import "LocationsAppDelegate.h"
#import "RootViewController.h"

@implementation LocationsAppDelegate

@synthesize navigationController;

@synthesize window=_window;

@synthesize managedObjectContext=__managedObjectContext;

@synthesize managedObjectModel=__managedObjectModel;

@synthesize persistentStoreCoordinator=__persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    RootViewController *rootViewController = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];

    NSManagedObjectContext *context = [self managedObjectContext];
    if(!context) {
        //handle the error you dummy!!
    }

    rootViewController.managedObjectContext = context;


    UINavigationController *aNavigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];
    self.navigationController = aNavigationController;


    [self.window addSubview:[navigationController view]];
    [self.window makeKeyAndVisible];

     [rootViewController release];
 [aNavigationController release];


    return YES;
}


- (void)applicationWillTerminate:(UIApplication *)application
{
    [self saveContext];
}

- (void)dealloc
{
    [_window release];
    [__managedObjectContext release];
    [__managedObjectModel release];
    [__persistentStoreCoordinator release];
    [super dealloc];
}

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {

            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}

#pragma mark - Core Data stack

- (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Locations" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Locations.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory

- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

@end

2 个答案:

答案 0 :(得分:3)

尝试使用

self.window

而不是

window

答案 1 :(得分:0)

稍微扩展一下这个答案:

您可以从@synthesize语句中看到属性窗口由实例变量_window支持。所以你使用窗口通过getter(self.window或[self window])访问它,但如果你试图直接访问实例变量,它将是_window。