如何正确使用NSUserDefaults类绕过View?

时间:2012-10-14 16:08:59

标签: objective-c ios xcode

我在xcode中有一个使用故事板的项目。加载的第一个视图是“接受条款和条件”视图,其中用户必须单击接受按钮才能继续。点击后,它会转到下一个视图。用户在第一次启动程序时单击“接受”后,我再也不希望他们再次看到该视图 - 我希望它直接进入下一个视图。我有一些代码,但它不起作用。这就是我的确切内容:

在app delegate中:(在applicationDidFinishLaunchingWithOptions中)

if([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]!=YES)
{
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"TermsAccepted"];
}

在接受条款和条件视图实现中:(viewDidLoad)

 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]){
    [self.navigationController pushViewController: self animated:YES];
    //I want it to go to the next screen
}
    else {
        //I want to show this screen, but I don't know what goes here
}

同样在接受条款和条件视图实现内(在接受按钮中)

 - (IBAction)acceptButton:(id)sender {
 [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"TermsAccepted"];
}

我运行它并得到错误:'不支持多次推送相同的视图控制器实例'。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

  1. 在您的第一个代码段中,您基本上会说“如果TermsAccepted不是YES(因此它是NO),则将其设置为NO。这没有意义”
  2. 在您的第二个代码段中,您编写了[self.navigationController pushViewController:self animated:YES];。所以基本上你要求当前的UIViewControllerself)推出自己的navigationController ...这也没有意义。
  3. 这就是你有这个错误的原因。您尝试推送当前的viewController self,而它已经在您的navigationController中的屏幕上。所以你试着在同一个navigationController上推送同一个实例(self)两次。

    你显然想要在导航控制器上推送另一个viewController(可能是一个TermsAndConditionViewController的实例或显示应用程序的条款和条件的东西),而不是当前的viewController本身,它不会感。

答案 1 :(得分:0)

首先,您希望让下一个视图控制器(您始终要显示的视图控制器)成为窗口的根视图控制器。在该控制器的viewDidLoad方法中,将您的if子句显示为接受条件和条件控制器 - 您可以使用presentModalViewController显示该子句。 if clase可以是这样的:

If([[NSUserDefaults standardUserDefaults] BoolForKey:@"TermsAccepted"] !=YES) {
    // instantiate your terms and conditions controller here
    // present the controller
}

然后,在您关闭条款和条件控制器的方法中,将该键的值设置为YES。