如何保存窗口状态
来源:互联网 发布:宽带网络分线盒 编辑:程序博客网 时间:2024/05/17 00:07
在iPhone手机客户端开发过程中经常会涉及到一些问题,如:如何保存窗口状态等等。
当应用别切到后台后,很难保证应用不被杀掉(用户主动杀掉或被系统杀掉),如果被杀掉,当程序
再次启动时就需要恢复前一次状态。ios sdk 6.0提供了一些接口让我们很容易实现对应用状态的保存,具体做法如下:
首先在AppDelegate中要实现如下几个方法:
- - (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder {
- return YES;
- }
- - (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder {
- return YES;
- }
- - (void)application:(UIApplication *)application willEncodeRestorableStateWithCoder:(NSCoder *)coder {
- [coder encodeObject:self.window.rootViewController forKey:PDAppDelegateRootViewCTLKey];
- }
- - (void)application:(UIApplication *)application didDecodeRestorableStateWithCoder:(NSCoder *)coder {
- UIViewController * ctl = [coder decodeObjectForKey:PDAppDelegateRootViewCTLKey];
- if (ctl) {
- UIWindow * window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
- window.rootViewController = ctl;
- self.window = window;
- }
- }
复制代码程序启动时会先调用
shouldRestoreApplicationState方法,因为方法返回YES,表明恢复应用状态,这时会顺序调用
didDecodeRestorableStateWithCoder方法,最后调用
didFinishLaunchingWithOptions, 该方法实现如下:- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- if (_window == nil) {
- self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
- // Override point for customization after application launch.
- PDViewController *viewController = [[[PDViewController alloc] initWithNibName:nil bundle:nil] autorelease];
- self.window.rootViewController = viewController;
- }
- [self.window makeKeyAndVisible];
- return YES;
- }
复制代码这里还涉及到一个ViewController的写法,该程序主要是为了保存ViewCtronller中的状态,所以ViewCtronller必须要支持状态恢复,如下:
- @interface PDViewController : UIViewController<UIViewControllerRestoration> {
- int _sliderValue;
- }
- @end
复制代码为了支持状态恢复必须实现UIViewControllerRestoration接口,同时还有几个方法需要实现:
- - (void)encodeRestorableStateWithCoder:(NSCoder *)coder {
- [super encodeRestorableStateWithCoder:coder];
- [coder encodeInt:_sliderValue forKey:@"sliderValue"];
- }
- - (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
- [super decodeRestorableStateWithCoder:coder];
- _sliderValue = [coder decodeIntForKey:@"sliderValue"];
- UISlider *slider = (UISlider*)[self.view viewWithTag:SliderTag];
- slider.value = _sliderValue;
- UITextField *textField = (UITextField*)[self.view viewWithTag:TextFieldTag];
- textField.text = [NSString stringWithFormat:@"%d", _sliderValue];
- }
- + (UIViewController *) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder {
- UIViewController *retViewController = [[[PDViewController alloc] initWithNibName:nil bundle:nil] autorelease];
- return retViewController;
- }
复制代码通过以上基本既可实现窗口状态的保存
参考:http://www.apkbus.com/android-130188-1-1.html
0 0