2013-01-03 96 views
0

我想在用戶第一次運行我的應用程序時顯示幫助覆蓋圖。要檢測應用程序的第一次運行

要做到這一點,我用下面的代碼在didFinishLaunching

if(![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"IPHONEFIRSTRUN"]) 
    [[NSUserDefaults standardUserDefaults]setBool:TRUE forKey:@"IPHONEFIRSTRUN"]; 

在視圖控制器,我有:

if ([[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUN"]==TRUE) { 
    [self HelpOverlayIphone]; 
    [[NSUserDefaults standardUserDefaults]setBool:FALSE forKey:@"IPHONEFIRSTRUN"]; 
} 

然而,它顯示了在第二次使用覆蓋以及。我怎樣才能解決這個問題?任何幫助表示讚賞。

+0

只是一個觀察,但你的關鍵是第一個例子中的IPADFIRSTRUN和第二個中的IPHONEFIRSTRUN。這是故意的嗎? –

+0

我會檢查的另一件事(不是它會解決你所看到的問題)是事實boolForKey已經返回一個布爾,所以檢查布爾,看看它是真的只是愚蠢的。 –

+0

對於錯字錯誤感到抱歉,第一個也是@「IPHONEFIRSTRUN」,但它不起作用 – Madhu

回答

4

您的邏輯過於複雜。您正在永久設置用戶默認值以指示一次發生的事情。相反,在視圖控制器看到,如果未設置值,如果是做你的行動,並設置變量,這樣的代碼不會被再次運行:

if (! [[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUNCOMPLETE"]) { 
     [self HelpOverlayIphone]; 
     [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"IPHONEFIRSTRUNCOMPLETE"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

在應用程序委託採取了所有的代碼。

此外,很可能您的原始代碼無法正常工作,因爲您正在從XCode停止應用程序。如果你不使用synchronize用戶的默認更改將不會保存在這種情況下(正常退出應用程序最終會永久保存更改)。

+0

這肯定會成爲一個問題。 – citruspi

+1

這是爲什麼downvoted .. –

+0

@MisVar:可能是因爲我的原始答案指出拼寫錯誤,海報更正。我的新答案應該滿足狂熱的下流者。 –

0

您是否在程序開始時註冊了您正在使用的默認值?我建議重讀蘋果文檔NSUserDefaults的here

您需要首先撥打電話到

- (void)registerDefaults:(NSDictionary *)dictionary 

它,如果它不存在將只設置鍵。然後在第一次運行時檢查鑰匙是否有誤,並在此時進行設置。

我的猜測是你的代碼不工作的原因是因爲字典從來沒有實際上以任何持久的方式被保存。

0

我有這個功能,當應用程序啓動時觸發 - 它總是可靠的。我有一個uniqueNameOfApp,它只是一些隨機哈希,所以它不會與其他應用程序發生衝突。

-(void)loadSettings { 
NSMutableDictionary *sttngs = [[NSUserDefaults standardUserDefaults] 
objectForKey:uniqueNameOfApp]; 

    if(sttngs != nil) { 
    [userSettings addEntriesFromDictionary:sttngs]; 
    } else { 
    _appFiredForFirstTime = YES; 
    } 
} 
+0

您保存的用戶默認設置無法被其他應用看到,所以不用擔心碰撞... –

相關問題