首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存iOS应用场景状态

保存iOS应用场景状态
EN

Stack Overflow用户
提问于 2012-04-15 23:18:16
回答 6查看 1.9K关注 0票数 11

这可能是不可能的,但是我试图保存我的应用程序在场景转换之间的状态,但是我不知道该做什么。目前,我喜欢这样一种方式:当您运行一个应用程序并按“主”按钮时,您可以回到刚才停止的那个应用程序,但是如果您在场景之间转换(在故事板中),那么一旦回到那个场景,应用程序状态就不会被保存。

我只需要保存两个不同的场景(您可以来回切换到另一个场景)。我如何在不占用精确内存的情况下保存故事板场景状态?

更详细:这里是我的整个故事板。您可以使用加号工具栏按钮在场景之间来回转换。在第二个场景中,用户可以点击表视图单元格,一个真实的图像将填充图像视图(见图1.2)。

图1.1

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

图1.2

问题:当你点击一个表格视图单元格,它填充了一个图像视图(如图1.2所示),如果你停留在那个场景,甚至点击iPhone主页按钮(如果你点击iPhone主页按钮,然后重新打开应用程序,场景的状态被保存,填充一个简单图像的图像视图仍然像我们离开它一样显示),但是如果我转换(使用加号按钮)回到第一个场景,然后使用第一个场景上的加号按钮返回第二个场景,我创建的图像视图(如图1.2所示)消失,第二个场景加载,而不保存我们填充的状态和图像视图。

编辑:我尝试在两个场景中使用相同的视图控制器,但没有解决问题。

更新:--我刚刚找到了以下代码(我认为它存储了视图状态)。我怎么能用这个?这就是我一直在找的东西吗?

代码语言:javascript
复制
MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil];
[[self navigationController] pushViewController:myViewController animated:YES];
[myViewController release];
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-04-25 00:19:46

我建议将以下两件事结合起来: 1.接受DBD的建议,确保不连续创建新的视图2.创建一个共享类,即数据控制器(用于高尔夫球手,以便数据独立于场景)。

正确的方法是将一个从左边的视图控制器引导到右边的一个。但是,如果您可以使用右边的,则可以将其驳回。

代码语言:javascript
复制
-(IBAction)buttonPushed:(id)sender 
      [self dismissModalViewControllerAnimated:YES];
}

这将使您返回左侧的视图控制器,左侧的视图控制器处于原始状态。现在的问题是如何将数据保存在右边。

要做到这一点,您可以创建一个单例类。Singleton类只有一个实例,因此无论您访问右边的视图控制器多少次,数据都是相同的。

单例类实现(名为DataManager的类)-标头

代码语言:javascript
复制
@interface DataManager : NSObject {
}

+(id)initializeData;
-(id)init;
@end

单例类实现(名为DataManager的类)- Main

代码语言:javascript
复制
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

然后,在视图控制器代码中,您可以像这样抓取这个实例

代码语言:javascript
复制
DataManager *sharedDataManager = [DataManager initializeDataManager];

这样,无论您切换多少次视图,您都将拥有相同的数据。另外,通过保持数据和视图控制器的分离,您可以更好地坚持MVC编程。(http://en.wikipedia.org/wiki/Model–view–controller)

票数 2
EN

Stack Overflow用户

发布于 2012-04-24 20:28:36

图1.1有一个根本性的缺陷,我认为这是您问题的基础。

Segue(故事板上控制器之间的箭头)创建了版本的UIViewControllers。你有圆形的塞格。因此,当你回到原来的屏幕,通过segue真的是通过创建一个新的版本你前进。

这可能会给内存的使用带来很大的问题,但也意味着您无法维护状态,因为每个新创建的项都是空的。

由于您使用的是UINavigationControllerpushViewController:animated:,所以您应该“弹出”控制器以摆脱它。

在“第二个”场景中,从+按钮中删除segue,并在一个IBAction事件上创建一个touchUpInside。在IBAction代码中添加"pop“

代码语言:javascript
复制
- (IBAction)plusButtonTapped {
    [self.navigationController popViewControllerAnimated:YES];
}
票数 2
EN

Stack Overflow用户

发布于 2012-04-15 23:33:30

我明白你说的了。这应该发生在每个应用程序上,因为当导航堆栈中的最后一个视图控制器被移除时,它将被释放和释放。如果您需要保存诸如文本或对象位置之类的值,则可能需要使用plist。有关如何使用plist,请参见this related question

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10167032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档