0

ローカル通知を作成するアプリがあります。アプリが閉じている場合 (つまり、実行されていないかバックグラウンドである場合)、通知から起動するとクラッシュします。どの行がアプリをクラッシュさせているかを突き止めることができました(以下のコメントに記載):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];

// Initialise the main view
self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

// Initialise a Navigation Controller
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];

// Set the ViewController as the rootViewController of the window
self.window.rootViewController = nav;

// Colour the navigation bar
nav.navigationBar.tintColor = [UIColor colorWithRed:0.07f green:0.59f blue:0.94f alpha:1];

// Set the background
if (isPhone568) {
    self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"santa_back5.png"]];
}
else {
    self.window.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"santa_back.png"]];
}

[self.window makeKeyAndVisible];
[nav release];

self.viewController.managedObjectContext = [self managedObjectContext];

application.applicationIconBadgeNumber = 0;

// Handle launching from a notification
UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {
    NSPredicate *predicate = [NSPredicate
                              predicateWithFormat:@"(dateCreated like %@)",
                              [localNotif.userInfo objectForKey:@"dateCreated"]];

    LetterViewController *letterView = [[LetterViewController alloc] initWithNibName:@"LetterViewController" bundle:nil];

    // Get the letter to pass on
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Letter" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:predicate];
    NSError *error;
//
// THIS NEXT LINE IS CRASHING THE APP
//
    NSArray *letters = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    Letter *myLetter = [letters objectAtIndex:0];

    letterView.theLetter = myLetter;
    //[myLetter release];

    // Pass the selected object to the new view controller.
    [self.viewController.navigationController pushViewController:letterView animated:YES];
    [letterView release];
    [fetchRequest release];
}

return YES;
}

次の 3 つの関数を使用して、管理対象オブジェクト コンテキスト、永続ストア コーディネーター、および管理対象オブジェクト モデルを取得しています。

//Explicitly write Core Data accessors
- (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;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

return managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: @"<Project Name>.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                              initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                             configuration:nil URL:storeUrl options:nil error:&error]) {
    /*Error for store creation should be handled in here*/
}

return persistentStoreCoordinator;
}

- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

この問題を解決するための助けをいただければ幸いです。

前もって感謝します。

4

2 に答える 2

0

いくつかのこと。あなたが示しているメイン スレッドで Core Data を使用しているように見えます。そうであれば、すべてのやり取りはこのスレッドで行う必要があります。ブロックを使用する新しい「perform」API を使用するように、いつかコードを更新する必要があります。

localNotif コードは起動デリゲートで重労働を行うようになったため、しばらく返されず、iOS がアプリを強制終了する可能性があります。同じコードを取り、それをメイン キューにポストされたディスパッチ ブロックに入れると、機能するはずです。いくつかのアサートを追加して、ナビゲーション コントローラーのプロパティも存在することを確認します。

于 2012-12-02T13:34:29.583 に答える
0

答えてくれてありがとう。私の問題は述語にあったようです!where句で「like」を使用するのは好きではありません。= に変更したところ、うまくいきました!

于 2012-12-02T18:42:50.503 に答える