2012-10-14 96 views
11

我用故事板創建了一個使用Xcode 4.5的應用程序。第一次啓動應用程序時,我希望初始視圖控制器顯示必須接受才能繼續的條款和條件。之後,我想讓應用程序啓動並跳過第一個視圖控制器並轉到第二個視圖控制器。如何僅在首次啓動時顯示視圖?

我知道我必須使用類NSUserDefaults的和某事的效果: 如果([標準NSUserDefaults的...] boolForKey:@「iHaveAcceptedTheTerms」])

但我從來沒有使用這個類之前並不知道如何實現此代碼。有人可以分享如何做到這一點的細節?

回答

10

你把你的AppDelegate :

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

//first-time ever defaults check and set 
if([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]!=YES) 
{ 
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"TermsAccepted"]; 
} 

然後你執行你的rootViewController的條款和條件以及接受它的方式。 您必須檢查的條款被接受,比如像這樣:

if ([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]){ 
    //proceed with app normally 
} 
else{ 
//show terms 
} 

當接受,下面的代碼將更改默認設置:

if(termsaccepted){ 
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"TermsAccepted"]; 
} 
+0

好的謝謝。您能否詳細說明如何讓應用程序「正常進行」與「顯示條款」? – jac300

+0

這取決於你。例如,用戶第一次啓動應用程序時,將顯示viewController(或僅顯示視圖,如果您使用單個VC)顯示條款。當條款被接受時,你關閉它,然後轉到第二個條目。這可以由alexandresoli解釋的根VC完成。用戶下次來時,根VC會立即顯示第二個VC。 – NightCoder

+0

謝謝。是的,我理解這個概念,但我無法弄清代碼。假設條款已被接受......我如何構建代碼來告訴程序「跳過當前的術語視圖並轉到下一個術語」?換句話說,看着alexandresoli的代碼片:[self presentViewController:YOUR_TERMS_CONTROLLER animated:YES completion:nil];什麼是「YOUR_TERMS_CONTROLLER」,如何標記視圖控制器並以編程方式引用它? – jac300

4

它看起來像這樣在你的第一個視圖或委託:

NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]; 

BOOL isAccepted = [standardUserDefaults boolForKey:@"iHaveAcceptedTheTerms"]; 

if (!isAccepted) { 
    [self presentViewController:YOUR_TERMS_CONTROLLER animated:YES completion:nil]; 
} else { 
    [self.navigationController pushViewController:YOUR_NORMAL_CONTROLLER animated:YES]; 
} 

不要忘記保存你的條件控制器上的用戶響應:

[standardUserDefaults setBool:YES forKey:@"iHaveAcceptedTheTerms"]; 
+0

好的,所以我把第一塊代碼放在viewDidLoad的「terms」視圖控制器中,對嗎?但是,如何設置視圖控制器的名稱......換句話說,我如何才能識別「YOUR_TERMS_CONTROLLER」的名稱? – jac300

+0

YOUR_TERMS_CONTROLLER是在用戶接受條款後出現的視圖控制器。放置代碼的正確位置在調用條款控制器的視圖內,它將負責調用條款或不。如果您有更多疑問,請嘗試編輯您的問題並添加一些代碼。 – alexandresoli

12

在保持這一問題的興趣最新的,這裏是一個Swift版本的接受答案。


STEP 1

在你應用代表,添加的功能。

​​3210

這將從根本上設置你的TermsAccepted布爾爲假,如果這是第一次推出(如BOOLS默認情況下)。


STEP 2

在你的根視圖控制器(當您的應用程序啓動,加載視圖控制器),你必須有一個方法,如果該條款已被接受與否和行爲因此。

添加以下功能。

override func viewDidAppear(animated: Bool) { 
    if NSUserDefaults.standardUserDefaults().boolForKey("TermsAccepted") { 
     // Terms have been accepted, proceed as normal 
    } else { 
     // Terms have not been accepted. Show terms (perhaps using performSegueWithIdentifier) 
    } 
} 

STEP 3

一旦用戶接受你的條件,你想改變你的TermsAccepted BOOL到真正。因此,在處理術語接受的方法體中,添加以下行。

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "TermsAccepted") 

我希望這有助於!

盧瓦克

+0

它對我來說非常完美。順便說一句,如果我調用didFinishLaunchingWithOptions中的第一個方法而不是applicationDidFinishLaunching,這有什麼關係嗎? Upvoted +1 – CAN

+0

@CAN應該也能工作! :) –

+0

我在我的應用程序委託中獲得'Signal SIGABRT'。這是怎麼回事? –

5

夫特3版

在AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    if !UserDefaults.standard.bool(forKey: "Walkthrough") { 
     UserDefaults.standard.set(false, forKey: "Walkthrough") 
    } 
} 

在根視圖控制器:

override func viewDidLoad() { 
    super.viewDidLoad() 
    if UserDefaults.standard.bool(forKey: "Walkthrough") { 
     // Terms have been accepted, proceed as normal    
    } else { 
     // Terms have not been accepted. Show terms (perhaps using 
    } 
} 

當術語已被接受,或教程演練完成:

UserDefaults.standard.set(true, forKey: "Walkthrough") 
相關問題