这可能是不可能的,但是我试图保存我的应用程序在场景转换之间的状态,但是我不知道该做什么。目前,我喜欢这样一种方式:当您运行一个应用程序并按“主”按钮时,您可以回到刚才停止的那个应用程序,但是如果您在场景之间转换(在故事板中),那么一旦回到那个场景,应用程序状态就不会被保存。
我只需要保存两个不同的场景(您可以来回切换到另一个场景)。我如何在不占用精确内存的情况下保存故事板场景状态?
更详细:这里是我的整个故事板。您可以使用加号工具栏按钮在场景之间来回转换。在第二个场景中,用户可以点击表视图单元格,一个真实的图像将填充图像视图(见图1.2)。

图1.1
在图1.2中,您可以看到当您点击多个表视图单元格中的一个单元格(弹出一个图像视图)时会发生什么。

图1.2
问题:当你点击一个表格视图单元格,它填充了一个图像视图(如图1.2所示),如果你停留在那个场景,甚至点击iPhone主页按钮(如果你点击iPhone主页按钮,然后重新打开应用程序,场景的状态被保存,填充一个简单图像的图像视图仍然像我们离开它一样显示),但是如果我转换(使用加号按钮)回到第一个场景,然后使用第一个场景上的加号按钮返回第二个场景,我创建的图像视图(如图1.2所示)消失,第二个场景加载,而不保存我们填充的状态和图像视图。
编辑:我尝试在两个场景中使用相同的视图控制器,但没有解决问题。
更新:--我刚刚找到了以下代码(我认为它存储了视图状态)。我怎么能用这个?这就是我一直在找的东西吗?
MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];发布于 2012-04-25 00:19:46
我建议将以下两件事结合起来: 1.接受DBD的建议,确保不连续创建新的视图2.创建一个共享类,即数据控制器(用于高尔夫球手,以便数据独立于场景)。
正确的方法是将一个从左边的视图控制器引导到右边的一个。但是,如果您可以使用右边的,则可以将其驳回。
-(IBAction)buttonPushed:(id)sender
[self dismissModalViewControllerAnimated:YES];
}这将使您返回左侧的视图控制器,左侧的视图控制器处于原始状态。现在的问题是如何将数据保存在右边。
要做到这一点,您可以创建一个单例类。Singleton类只有一个实例,因此无论您访问右边的视图控制器多少次,数据都是相同的。
单例类实现(名为DataManager的类)-标头
@interface DataManager : NSObject {
}
+(id)initializeData;
-(id)init;
@end单例类实现(名为DataManager的类)- Main
static DataManager *sharedDataManager = nil;
@implementation DataManager
+(id)initializeData {
@synchronized(self) {
if (sharedDataManager == nil)
sharedDataManager = [[self alloc] init];
}
return sharedDataManager;
}
-(id)init {
if(self == [super init]) {
}
return self;
}
@end然后,在视图控制器代码中,您可以像这样抓取这个实例
DataManager *sharedDataManager = [DataManager initializeDataManager];这样,无论您切换多少次视图,您都将拥有相同的数据。另外,通过保持数据和视图控制器的分离,您可以更好地坚持MVC编程。(http://en.wikipedia.org/wiki/Model–view–controller)
发布于 2012-04-24 20:28:36
图1.1有一个根本性的缺陷,我认为这是您问题的基础。
Segue(故事板上控制器之间的箭头)创建了新版本的UIViewControllers。你有圆形的塞格。因此,当你回到原来的屏幕,通过segue真的是通过创建一个新的版本你前进。
这可能会给内存的使用带来很大的问题,但也意味着您无法维护状态,因为每个新创建的项都是空的。
由于您使用的是UINavigationController和pushViewController:animated:,所以您应该“弹出”控制器以摆脱它。
在“第二个”场景中,从+按钮中删除segue,并在一个IBAction事件上创建一个touchUpInside。在IBAction代码中添加"pop“
- (IBAction)plusButtonTapped {
[self.navigationController popViewControllerAnimated:YES];
}发布于 2012-04-15 23:33:30
我明白你说的了。这应该发生在每个应用程序上,因为当导航堆栈中的最后一个视图控制器被移除时,它将被释放和释放。如果您需要保存诸如文本或对象位置之类的值,则可能需要使用plist。有关如何使用plist,请参见this related question。
https://stackoverflow.com/questions/10167032
复制相似问题