我在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"];
}
我运行它并得到错误:'不支持多次推送相同的视图控制器实例'。我该如何解决这个问题?
答案 0 :(得分:1)
[self.navigationController pushViewController:self animated:YES];
。所以基本上你要求当前的UIViewController
(self
)推出自己的navigationController ...这也没有意义。这就是你有这个错误的原因。您尝试推送当前的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。