1

私はiOSプログラミングに不慣れで、簡単なリマインダースタイルのアプリを作成しましたが、以前はすべてのコードがView Controller内にあったため、MVCモデルを正しく実装するように書き直しています。

プロパティ名、時間、繰り返しなど、次の構造を持つEventというカスタムクラスがあります。

モデルクラス

データを取得、処理、および保存します。NSUserDefaults

RootViewController

Modelオブジェクトのインスタンスを作成し、モデルにすべてのEventsオブジェクトを返すように要求してからNSUserDefaults、それらをに表示します。UITableView

EditEventViewController

[editEventVC initWithEvent:theEvent];

initメソッドを介してテーブルセルで選択された特定のイベントオブジェクトを渡し、編集可能なすべてのプロパティを表示します

EditEventPropertyViewController

[editEventPropertyVC initWithValue:propertyValue];

initメソッドを介して編集するプロパティの値(イベント名など)を渡し、デリゲートメソッドを介してユーザーが更新した値を返します

これはこのアプリを実装する正しい方法ですか?

NSUserDefaultsEditEventViewControllerで終了した後、モデルを介して更新されたイベントオブジェクトを保存するための最良の方法は何ですか?代理人経由?現在、rootViewControllerのviewWillAppearでuitableviewデータをリロードしているため、更新されたデータを再度取得する前に保存する必要があります。

ありがとう

4

1 に答える 1

1

Eventのコレクションをに保存できますNSUserDefaultsNSCodingカスタムクラスなので、にシリアル化するためのプロトコルを実装する必要がありますNSUserDefaults

//Event.h

    @interface Event : NSObject<NSCoding>

    @property (nonatomic, copy)   NSString *name;
    @property (nonatomic, strong) NSDate *time;
    @property (nonatomic) NSInteger repeat;

    - (void)save;
    + (NSArray *)allEvents;

//Event.m
#define kSavedEvents @"SavedEvents"

#pragma mark - Encoding
- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:self.name  forKey:@"EventName"];
    [encoder encodeObject:self.time forKey:@"EventTime"];
    [encoder encodeObject:@(self.repeat) forKey:@"EventRepeat"];

}

#pragma mark - Decoding
- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if (self)
    {
        _name   = [decoder decodeObjectForKey:@"EventName"];
        _time   = [decoder decodeObjectForKey:@"EventTime"];
        _repeat = [[decoder decodeObjectForKey:@"EventRepeat"]integerValue];

    }
    return self;
}

NSUserDefaultsに保存するときにデータをアーカイブし、フェッチするときにアーカイブを解除する必要があります

 (void)save
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSData *savedData = [defaults objectForKey:kSavedEvents];


    NSMutableArray *savedEvents = [@[] mutableCopy];

    //Some events are already there in there
    if (savedData) {
        savedEvents = [[NSKeyedUnarchiver unarchiveObjectWithData:savedData]mutableCopy];
    }

    [savedEvents addObject:self];

    //Archiving the savedEvents to data
    NSData *newEventData = [NSKeyedArchiver archivedDataWithRootObject:savedEvents];

    [defaults setObject:newEventData forKey:kSavedEvents];
    [defaults synchronize];
}

+ (NSArray *)allEvents
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *data = [defaults objectForKey:kSavedEvents];
    if (data)
    {
        return [NSKeyedUnarchiver unarchiveObjectWithData:data];
    }
    return nil;
}

これで始められることを願っています。

于 2013-03-06T09:02:13.780 に答える