如何在可可中保持应用程序状态

Posted

技术标签:

【中文标题】如何在可可中保持应用程序状态【英文标题】:How to Persist Application State in cocoa 【发布时间】:2013-08-26 07:48:15 【问题描述】:

我需要在应用程序终止时存储应用程序的状态,以便当用户重新运行应用程序时,应用程序从上次关闭的状态运行。这是某种恢复应用程序,但是当应用程序意外关闭时会调用恢复方法。但是每次用户意外关闭时我都需要恢复应用程序手动关闭它。 我只需要存储 App UI 而不是应用程序的数据。 任何想法都会对我有所帮助。 谢谢

【问题讨论】:

【参考方案1】:

您可以使用任何可用的方法保持状态,例如:

我。 NSUserDefaults

例子:

//saving
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:YES forKey:@"testBool"];
//retrieving
[defaults boolForKey:@"testBool"];

二。序列化状态对象。

ios 4 iPhone Data Persistence using Archiving Correct way to save/serialize custom objects in iOS

三。保存为 plist 文件

例子:

NSMutableDictionary *stateDictionary = [NSMutableDictionary dictionary];
//set state
...

//saving
[stateDictionary writeToFile:<filePath> atomically:YES];

//retrieve
stateDictionary = [NSMutableDictionary dictionaryWithContentsOfFile:<filePath>]

四。使用 sqlite 或 Core-Data

(很可能不需要,除非 您的应用程序的状态处于某种对象关系模型中)

更新: 为了保留窗口的 UI 状态, 检查此link 并在用户界面保留标题下。

【讨论】:

你能解释一下如何使用这些来存储添加到 NSWindow 上的控件框架。并且请不要告诉存储每个控件的框架,因为我在窗口上有很多控件并且存储每个控件框架是一项非常大的任务。 不幸的是 NSWindow 不能直接序列化或写入文件。您可以让子类 NSWindow 覆盖编码方法(请参阅列表项 ii 的链接),或者您可以检查我在更新答案中提供的链接。【参考方案2】:
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender

    //saveData
    return NSTerminateNow;

如果要保存 NSWindow 位置,可以使用[window saveFrameUsingName:@"myWindow"]; 并使用[window setFrameAutosaveName:@"myWindow"];@应用启动。

【讨论】:

我知道这个方法,它是在应用程序终止时调用的。我的问题是,如何存储应用程序状态(UI 控件的位置)。 在 NSUserDefaults 中显示 UI 控件的位置 可以使用 saveFrameUsingName: 保存 NSWindow 位置 setFrameAutosaveName:

以上是关于如何在可可中保持应用程序状态的主要内容,如果未能解决你的问题,请参考以下文章

TableView 不允许我按下并转移视图。 Obj-C,可可触摸

可可:像窗口一样停靠

如何开始在 mac os 的可可应用程序中处理标签?

如何在可可中的应用程序停靠图标上绘制mac旋转等待光标

如何在objective-c中使对象在整个应用程序中保持活动状态

睡眠后可可 NSTimer