2012-10-14 51 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") 
相关问题