在一个类的实例中编码数据并在不同类的实例中解码数据

时间:2014-03-17 23:11:58

标签: ios objective-c nscoding

我是Objective-C和Cocoa Touch的新手。我有两个视图控制器,一个是一个类的实例,第二个是不同类的实例。使用我在第二个视图控制器中使用的编码数据。我想从第一个视图控制器将数据设置为nil。这是可能的,如果可能的话怎么样?附加的是用于将数据保存在第二个视图控制器中的代码。我没有代码来解码第一个控制器中的数据。

- (void)saveImages
{
    NSMutableData *data = [[NSMutableData alloc]init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver         alloc]initForWritingWithMutableData:data];

if(self.finalFaceImage != nil)
{
    [archiver encodeObject:self.finalFaceImage forKey:@"face"];
}
if(self.finalEyesImage != nil)
{
    [archiver encodeObject:self.finalEyesImage forKey:@"eyes"];
}
if(self.finalNoseImage != nil)
{
    [archiver encodeObject:self.finalNoseImage forKey:@"nose"];
}
if(self.finalLipsImage != nil)
{
    [archiver encodeObject:self.finalLipsImage forKey:@"lips"];
}

[archiver finishEncoding];
[data writeToFile:[self dataFilePath] atomically:YES];

}

3 个答案:

答案 0 :(得分:0)

如果第一个视图控制器创建第二个视图控制器作为子视图控制器,那么它可以保持对它的引用并在其上调用方法来使数据无效。请参阅有关使用子视图控制器的文档:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

否则,如果第一个在解除之前创建了第二个,它也可以在转换到它之前调用它上面的方法。

根据您的架构,有很多方法可以解决这个问题。

希望这有帮助。

答案 1 :(得分:0)

对应用程序设计采用the model-view-controller方法是个好主意。将应用程序的数据(模型)分离到自己的类中。然后,您可以实例化此类并在视图控制器之间传递引用。

这样做的一个好方法是在appDelegate中实例化模型(例如在didFinishLaunchingWithOptions:中)并将其存储在appDelegate的属性中。然后,只要您需要访问数据,就可以使用[UIApplication sharedApplication].delegate.myData

之类的内容来获取引用

您的saveImages方法(以及相应的loadImages方法,如果需要)也会移动到您的模型类中,尽管您的viewController仍然可以调用它。

答案 2 :(得分:0)

这是MVC(模型视图控制器)设计模式的完美案例。该模型是MVC中的数据存储对象。

创建一个数据容器对象,该对象具有保存您需要共享的数据的属性。

为视图控制器提供指向此对象的指针,以便他们可以根据需要读取/写入数据。

然后在该对象中实现NSCoding。当您的对象符合NSCoding时,您可以使用NSKeyedArchiver方法archivedDataWithRootObject:通过一次调用将整个对象存档到NSData块中。