0

まず、NSMutableArray を管理するクラスがあります。クラスがインスタンス化されると、保存された配列が既に存在するかどうかを調べてロードするか、そうでない場合は新しい配列を作成する必要があります。

アイテムが追加されるたびに保存する必要があります。しかし: 何も起こりません。

#import "NEList.h"

@interface NEList()



@end

@implementation NEList
@synthesize theInternArray;



-(id) initWithArray {
    self = [super init];

    if(self != nil) {
             NSLog(@"build");

        theInternArray = [[NSMutableArray alloc] initWithCapacity:20];

        return self;
    }
    return nil;
}

-(id) initWithContent {
    self = [super init];

    if(self != nil) {
        NSLog(@"load");

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"theFiles"];

        theInternArray = [NSMutableArray arrayWithContentsOfFile:filePath];

        if(theInternArray == nil) {
            theInternArray = [[NSMutableArray alloc] initWithCapacity:200];
        }
               NSLog(@"second %@", theInternArray);
        return self;
    }
    return nil;
}

-(BOOL) save {

   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
   NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"theFiles"];


    return [self.theInternArray writeToFile:filePath atomically:NO];
}

-(BOOL) addObject:(NEListItem *)theItem {

    [theInternArray addObject:theItem];    [self save];





    UILocalNotification *localNotif = [[UILocalNotification alloc] init];

    localNotif.fireDate = theItem.theBestBeforeDate;
    localNotif.timeZone = [NSTimeZone defaultTimeZone];

    localNotif.alertBody = [theItem.theName stringByAppendingString:@" expires!"];
    localNotif.alertAction = NSLocalizedString(@"View Details", nil);

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;



    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];


    return true;
}


-(NEListItem *) getElementAtIndex:(NSUInteger)theIndex {
    return [theInternArray objectAtIndex:theIndex];
}

-(BOOL)removeObjectByName:(NSString *)theName {

    for (NEListItem *tempItem in theInternArray) {

        if([tempItem.theName isEqualToString:theName]) {
            [theInternArray removeObject:tempItem];
            break;
            return true;
            }
    }

            NSLog(@"Nicht gefunden");
            return false;
        }






@end

save メソッドは、NEList のインスタンスを所有する別のクラスで呼び出されます。

4

2 に答える 2

1

OK、変更したのは「initWithContent」メソッドと保存メソッドだけです。コードをコメントアウトし、その下で NSUserDefaults を使用するように変更しました。NSUserDefaults は配列のバイナリ ファイルを保存し、後でそれを取得して NSArray に変換する必要があります。これがうまくいかない場合は、どのようなエラーが発生したかをお知らせください。

-(id) initWithContent {
    self = [super init];

    if(self != nil) {
        NSLog(@"load");
        /*
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"theFiles"];

        theInternArray = [NSMutableArray arrayWithContentsOfFile:filePath];

        if(theInternArray == nil) {
            theInternArray = [[NSMutableArray alloc] initWithCapacity:200];
        }
        NSLog(@"second %@", theInternArray);*/
        NSUserDefaults *uDefaults = [NSUserDefaults standardUserDefaults];
        theInternArray = [uDefaults objectForKey:@"internArray"];
        if (!theInternArray)
        {
            theInternArray = [[NSMutableArray alloc] initWithCapacity:200];
        }
        NSLog(@"%@", theInternArray);

        return self;
    }
    return nil;
}

-(BOOL) save {

    /*NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"theFiles"];*/

    NSUserDefaults *uDefaults = [NSUserDefaults standardUserDefaults];
    [uDefaults setObject:theInternArray forKey:@"internArray"];


    //return [self.theInternArray writeToFile:filePath atomically:NO];
    return [uDefaults objectForKey:@"internArray"];
}

ああ、あなたのやり方がうまくいかなかった理由は、ファイルを保存してから戻すのはそれほど簡単ではないからです。配列からデータ(「item1、item2、item3など」など)をファイルに出力し、それを解析して後でそのデータを使用してNSArrayを作成する必要があります。

于 2012-08-23T21:30:03.110 に答える
1

だから、これは私のために働いた解決策です。まず、これは配列に格納されているカスタム クラスです。

#import <Foundation/Foundation.h>

@interface NEListItem : NSObject <NSCoding>

@property (nonatomic, strong) NSString *theName;
@property (nonatomic, strong) NSString *theBestBeforeDate;
@property (nonatomic, strong) NSDate *theInternDate;


-(id) initWithName:(NSString *) theInitName;
 @end

そして実装

#import "NEListItem.h"

@implementation NEListItem
@synthesize theName = _theName;
@synthesize theBestBeforeDate = _theBestBeforeDate;
@synthesize theInternDate = _theInternDate;

-(id)initWithName:(NSString *)theInitName {
    self = [super init];
    if(self != nil) {
        self.theName = theInitName;

        return self;
    }
    return nil;
}

- (void)encodeWithCoder:(NSCoder *)coder;
{
    [coder encodeObject:self.theName forKey:@"theName"];
    [coder encodeObject:self.theBestBeforeDate forKey:@"theBBDate"];
    [coder encodeObject:self.theInternDate forKey:@"theInternDate"];
}

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[NEListItem alloc] init];
    if (self != nil)
    {
        self.theName = [coder decodeObjectForKey:@"theName"];
        self.theInternDate = [coder decodeObjectForKey:@"theInternDate"];
        self.theBestBeforeDate = [coder decodeObjectForKey:@"theBBDate"];
    }
    return self;
}

@end

したがって、これはカスタム値を保存するために必要です。

保存方法:

-(BOOL) save {

    NSLog(@"save called");
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:theInternArray] forKey:@"savedArray"];
    return true;
    }

init メソッドの一部であるローディング

 NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
        NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];


            NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];

        if (oldSavedArray != nil) {
                theInternArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
            return self;
        }
            else
                          theInternArray = [[NSMutableArray alloc] initWithCapacity:200];
        return self;
        }

私を大いに助けてくれたManOxに感謝します

于 2012-08-24T01:10:14.057 に答える