5

バックグラウンドモードのアプリまたはアプリを閉じたときに保存する必要があるcartArray(上記のAppDelegate.h @interfaceにあります)があります。アイテム(カート)を追加してバックグラウンドに入るか、マイナス記号を押してアプリケーションを閉じたときに、cartArrayに何もないときにアプリは正常に機能しました。私の cartArray には、カートクラスが含まれています。何が起こっているか知ってもいいですか?オンラインのチュートリアルはとても複雑で、説明の途中でいつも迷ってしまいます。

[AppDelegate.m]

- (void)applicationDidEnterBackground:(UIApplication *)application {
[AppDelegate saveData]; 
}

- (void)applicationWillEnterForeground:(UIApplication *)application {   
[AppDelegate getData];   
}

+(NSString *) getPathToAchieve{  NSLog(@"+++++getPathToAchieve");
    static NSString* docsDir = nil;
    if (docsDir == nil) {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        docsDir = [paths objectAtIndex:0];
    }
    NSString *fullFileName = [NSString stringWithFormat:@"%@.plist", docsDir];
    return fullFileName;
}

- (void)applicationWillTerminate:(NSNotification *)notification{    
    [cartArray writeToFile:[AppDelegate getPathToAchieve] atomically:YES];
}

-(id)initWithCoder:(NSCoder *)aDecoder
{   self = [super init];
   if (self != nil)
   {
        cartArray = [aDecoder decodeObjectForKey:@"cartArrayKeys"];
   }
    return self;  
}

-(void)encodeWithCoder:(NSCoder *)anEncoder
{   
    [anEncoder encodeObject:cartArray forKey:@"cartArrayKeys"];
}

+(void)saveData{ 
     [NSKeyedArchiver archiveRootObject:cartArray toFile:[self getPathToAchieve] ];
}

+(id)getData{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:[self getPathToAchieve]];
}
4

3 に答える 3

1

あなたのコードはかなり面倒です。まず、クラスではなく、クラスに-(id)initWithCoder:andを実装-(void)encodeWithCoder:します(そして、プロトコルに準拠していることを確認してください):CartAppDelegateCartNSCoding

- (void) encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.title forKey:@"title"];
    [encoder encodeObject:self.description forKey:@"description"];
    .....
}

- (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
        self.title = [decoder decodeObjectForKey:@"title"] ;
        self.description = [decoder decodeObjectForKey:@"description"] ;
        ....
    }
    return self;
}   

次に、実装-(void)saveDataして-(void)getData:

-(void)saveData{ 
     [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:cartArray] forKey:@"cartArray"];
}

-(void)getData{ 
    NSData *savedArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"cartArray"];
    if (savedArray != nil)
    {
        NSArray *oldArray = [NSKeyedUnarchiver unarchiveObjectWithData:savedArray];
        if (oldArray != nil) {
            cartArray = [[NSMutableArray alloc] initWithArray:oldArray];
        } else {
            cartArray = [[NSMutableArray alloc] init];
        }
    }
}

saveDataアプリケーションが終了する/バックグラウンドに入るときに呼び出します。getDataアプリケーションがロードされたときに呼び出します。

于 2013-08-30T07:57:00.427 に答える
1

すべての節約を

- (void)applicationWillResignActive:(UIApplication *)application

ドキュメントから:

アプリケーションが非アクティブになろうとしていることをデリゲートに伝えます。このメソッドは、アプリケーションがアクティブ状態から非アクティブ状態に移行しようとしていることをアプリケーションに知らせるために呼び出されます。これは、特定の種類の一時的な中断 (電話や SMS メッセージの着信など) や、ユーザーがアプリケーションを終了してバックグラウンド状態への移行を開始したときに発生する可能性があります。非アクティブ状態のアプリケーションは引き続き実行されますが、着信イベントはレスポンダーにディスパッチされません。このメソッドを使用して、進行中のタスクを一時停止し、タイマーを無効にし、OpenGL ES フレーム レートを調整する必要があります。ゲームは、このメソッドを使用してゲームを一時停止する必要があります。非アクティブ状態のアプリケーションは、アクティブ状態またはバックグラウンド状態への移行を待機している間、最小限の作業を行う必要があります。

于 2013-08-30T07:47:06.420 に答える
0

一部のデータを永続的に保存したい場合は、配列は一時的なストレージであり、NSUSerDefult を使用してみてください。アプリ配列を閉じた後、消える場合があります。NSUSerDefult データは消えません。NSUserDefault は、アプリを削除するか、シミュレーターからアプリを削除する場合にのみ消えます。

于 2013-08-30T07:44:05.847 に答える