iOS的MVC - 传递数据来回查看控制器和模型(iOS MVC - Passing data b

2019-08-17 08:19发布

我是新来的iOS编程和已经写了一个简单的提醒风格的应用程序,现在我重写,正确地实现了MVC模型之前我所有的代码是视图控制器内。

我有一个名为事件具有属性名称,时间自定义类,重复等,然后结构如下:

Model类

检索,处理和并保存数据和从NSUserDefaults

RootViewController的

创建模型对象的实例,并要求该模型返回所有活动对象从NSUserDefaults然后将它们显示在UITableView

EditEventViewController

[editEventVC initWithEvent:theEvent];

传递之前已在通过init方法表格单元选择的特定事件对象,并显示所有可用于编辑的属性

EditEventPropertyViewController

[editEventPropertyVC initWithValue:propertyValue];

传递的属性值,以经由init方法编辑(例如事件名称),并通过一个委托方法返回用户更新值

这是实现这个应用程序的正确方法是什么?

什么是保存在更新事件对象的最佳方式NSUserDefaults通过模型的EditEventViewController完成后? 通过委托? 目前,我重装上viewWillAppear中的UITableView的数据在RootViewController的,因此将重新检索之前将其更新的数据保存。

谢谢

Answer 1:

你可以收集存储EventNSUserDefaults 。 由于它是一个自定义类,您需要实现NSCoding协议进行序列化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;
}

希望这将让你开始。



文章来源: iOS MVC - Passing data back and forth to view controllers and model