【问题标题】:iOS MVC - Passing data back and forth to view controllers and modeliOS MVC - 来回传递数据到视图控制器和模型
【发布时间】:2013-02-20 18:44:13
【问题描述】:

我是 iOS 编程新手,编写了一个简单的提醒样式应用程序,我现在正在重写它以正确实现 MVC 模型,因为以前我的所有代码都在视图控制器中。

我有一个名为 Event 的自定义类,其中包含属性名称、时间、重复等,然后是以下结构:

模型类

NSUserDefaults 中检索、处理和保存数据

RootViewController

创建模型对象的一个​​实例并要求模型从NSUserDefaults返回所有事件对象,然后将它们显示在UITableView

EditEventViewController

[editEventVC initWithEvent:theEvent];

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

EditEventPropertyViewController

[editEventPropertyVC initWithValue:propertyValue];

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

这是实现此应用的正确方法吗?

在使用 EditEventViewController 完成后,通过模型将更新的 Event 对象保存在 NSUserDefaults 中的最佳方法是什么?通过代表?目前我正在 rootViewController 中的 viewWillAppear 上重新加载 uitableview 数据,因此它必须在再次检索之前保存更新的数据。

谢谢

【问题讨论】:

  • 我不喜欢使用 nsdata 作为我的“持久”存储。虽然你为什么不尝试核心数据,但它对设置有好处
  • @amar - 谢谢,是的,我打算在完成这项工作后使用 Core Data,但我认为在结构方面原则是相同的?
  • 您可以使用委托方法或通知器进行数据传递

标签: iphone ios objective-c model-view-controller


【解决方案1】:

您可以将Event 的集合存储在NSUserDefaults 中。由于它是一个自定义类,因此您需要实现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;
}

希望这能让你开始。

【讨论】:

  • 谢谢 - 实际上我还没有意识到在 NSUserDefaults 中存储自定义对象会有问题,所以谢谢你!但是,我的问题是关于来回传递数据 - 我的结构看起来正确吗?
  • @fxfuture 我相信这个解决方案仍然适用。例如。如果您在 FirstViewController 中并创建了一个事件,请将其保存在那里。在 SecondViewController 上,您可以在那里获取已保存的事件并对其进行编辑和重新保存。或者另一种方法是在 SecondViewController 中创建一个属性来保存事件,而实例化从 FirstViewController 中设置事件的值。
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 2021-02-24
  • 2012-07-08
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多