我是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];
}
答案 0 :(得分:0)
如果第一个视图控制器创建第二个视图控制器作为子视图控制器,那么它可以保持对它的引用并在其上调用方法来使数据无效。请参阅有关使用子视图控制器的文档:
否则,如果第一个在解除之前创建了第二个,它也可以在转换到它之前调用它上面的方法。
根据您的架构,有很多方法可以解决这个问题。
希望这有帮助。
答案 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块中。