2

アプリが最後に開いたものを覚えておく必要があるUIViewControllerため、アプリがメモリ不足で読み込まれると、 のrootViewControllerプロパティを にAppDelegate保存されたものに置き換えNSUserDefaultsます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window = window;

    frontViewController = [[SGLoginScreenViewController alloc] init];

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:frontViewController];

    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];
    return YES;
}

私がやりたいことはViewDidLoad、それぞれのメソッドにいくつかのコードを入れViewController、その名前を で覚えておいて、NSUserDefaults後で で使用することですdidFinishLaunchingWithOptions。次のようなものです。

[[NSUserDefaults standardUserDefaults] setObject:self forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

ただし、問題は、XCode が次の警告を表示していることです。

*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<SGMainScreenFirstTimeViewController: 0x8e1fea0>' of class 'SGMainScreenFirstTimeViewController'.  Note that dictionaries and arrays in property lists must also contain only property values.

この全体を正しく実装する方法についてのアイデアはありますか? 前もって感謝します

4

4 に答える 4

8

Key-Value コーディング (NSString、NSnumber など) に準拠できるユーザー デフォルト オブジェクトのみを保存できます。クラスを文字列に変換し、クラス名を知っているクラスを再作成することは、達成したいことを実現する方法です。これは、NSUserDefaults に保存するための良い方法です。

[[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass([self class]); forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

そして、ロードバックするために、以下のように、保存された文字列に基づいてクラスを再作成します。

NSString *savedClassName = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"];
UIViewController *controller = [(UIViewController *)NSClassFromString(savedClassName) alloc] init];
于 2013-01-25T09:18:35.117 に答える
0

まず、変更可能な値を NSUserDefaults に保存することはできません。次の疑似コードを確認してください:

[[NSUserDefaults standardUserDefaults] setObject:@"nibnameofcurrentViewController" forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

アプリが再び起動したら、次の操作を行います。

UIViewController *controller=[[UIViewController alloc]initWithNibName:[[NSUserDefault standerdDefault]objectForkey:@"currentViewController"] bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:frontViewController];
self.window.rootViewController = navController;
于 2013-01-25T09:21:36.343 に答える
0

NSUSerDefaults基本的にデフォルト値を保存することです...大きなオブジェクトではありません(保存できるアイテムのリストには(NSString、NSData、NSDictionary、NSArray、NSNumber)が含まれます..次回は覚えておいてください。

機能を実行するためのより良い方法。

[[NSUserDefaults standardUserDefaults] setObject:@"Second View" forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

そしてアプリのロード時

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"] isEqualToString:@"Second View"])
{
//your code/logic
于 2013-01-25T09:15:46.447 に答える
0

ドキュメントによると:

値パラメーターは、プロパティ リスト オブジェクトのみにすることができます: NSDataNSStringNSNumberNSDateNSArrayまたはNSDictionaryNSArrayおよびオブジェクトの場合NSDictionary、その内容はプロパティ リスト オブジェクトでなければなりません。

そのため、View Controller の名前を保存し、その名前を知っていれば、起動時に復元できます。

于 2013-01-25T09:16:36.723 に答える