2012-11-20 28 views
2

我的應用程序包含幾個視圖,我想顯示一個小的設置,當應用程序啓動時,用戶還沒有完成嚮導。 我知道我可以通過NSUserDefaults實現這一點,但我不確定如何根據NSUserDefaults存儲的輸入字符串來顯示特定的視圖。NSUserDefaults記住視圖

我AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:@"WIZARD_VIEW"]; 
    if ([controllerName length]) { 
     Class controllerClass = NSClassFromString(controllerName); 
     UIViewController *controller = [[controllerClass alloc] init]; 

    // Override point for customization after application launch. 
    return YES; 
    } 

然後在視圖 - 控制文件中添加以下代碼建議從jfaller:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults]; 
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ]; [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults]; 
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

但我怎麼能做出這種因此它會顯示特定已在設置中選擇的視圖?

+0

您不想調用註冊表erDefaults:這裏。通常每個應用程序啓動只調用一次registerDefaults。你確實想調用setObject:forKey :. – jfaller

回答

3

就個人而言,我會做到以下幾點:

用戶每次去你的嚮導一個新的觀點,記錄的UIViewController在用戶的默認值:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [[NSUserDefaults standardUserDefaults] setObject:[[self class] description] forKey:WIZARD_VIEW]; 
    [[NSUserDefault standardUserDefaults] synchronize]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:WIZARD_VIEW]; 
    [[NSUserDefault standardUserDefaults] synchronize]; 
} 

當用戶重新啓動應用程序(假設在嚮導中),重新加載視圖:

- (BOOL)application:(UIApplication *)application 
    willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // etc. 
    NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:WIZARD_VIEW]; 
    if ([controllerName length]) { 
    Class controllerClass = NSClassFromString(controllerName); 
    NSViewController *controller = [[controllerClass alloc] init]; 
    // push the controller, or whatever.... 
    } 
    // etc. 
} 
+0

在我接受這個答案(因爲它幾乎完成了這項工作)之前,請您將「willFinishLaunchingWithOptions」更加清晰,因爲它真的根據xcode進行了錯誤操作,在此先感謝您的幫助! – user1839995

+0

更具體地說,我使用ARC,它給出了以下錯誤:「從int到類的implict轉換不允許使用ARC」 - 「objc_lookUpClass在C99中無效」以及更多.. – user1839995

+0

try:Class controllerClass = NSClassFromString(controllerName);它不需要標題和ARC抱怨的其他一些事情。 – jfaller

1

將視圖加載到NSUserDefaults視圖中。然後檢查didFinishLaunchingWithOptions中的值。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"current_setup"] isEqualToString:@"1"]) { 

     //on view 1! 

    } 

} 
+0

如何在下次使用故事板時實現它的正確啓動? – user1839995