iPhone Development Blog系列: 如何制作服务条例窗口

最近一直关注iPhone Development Blog上面的文章,学习的同时尝试通过翻译和整理同大家一起分享!

假设你想让你的每个客户在使用iPhone应用前接受你的服务条例(Terms of Services)或其他一些法律声明。

在启动时显示
通过Xcode生成的标准AppDelegate代码会创建并显示你的第一个应用界面。这是一个你可以通过UIView的hidden属性在不用打断应用接下来的流程情况下显示新界面的地方。

  1. // Create window  
  2. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];  
  3. [window setBackgroundColor:[UIColor whiteColor]];  
  4.  
  5. // Set up main view navigation controller  
  6. MainMenuViewController *navController = [[MainMenuViewController alloc] init];  
  7.  
  8. // Create a navigation controller using the new controller  
  9. navigationController = [[UINavigationController alloc] initWithRootViewController:navController];  
  10. navigationController.navigationBarStyle = UIBarStyleDefault;  
  11.  
  12. [navController release];  
  13.  
  14. // Create Terms of Service screen  
  15. tosController = [[TermsOfServiceViewController alloc] init];  
  16. [window addSubview:[tosController view]];  
  17. navigationController.view.hidden = YES;  
  18.  
  19. // Add the navigation controller's view to the window  
  20. [window addSubview:[navigationController view]];  
  21. [window makeKeyAndVisible];  

大部分的基础代码都是Xcode生成的。新增代码从第14行开始。实例化TermsOfServiceViewController 并加入到视图中。重要的是第17行,它隐藏了navigationController。

关闭新窗口
现在已经显示了服务条例窗口并且主菜单已经隐藏。我们需要关闭服务条例窗口并回到正常的应用流程。
在AppDelegate类中创建一个新方法:

  1. - (void)termsOfServiceAccepted  
  2. {  
  3.  tosController.view.hidden = YES;  
  4.  navigationController.view.hidden = NO;  
  5. }  


在TermsOfServiceController中需要添加一个用户点击的按钮:
 

  1. UIButton *acceptButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];  
  2. acceptButton.frame = CGRectMake(kLeftMargin,  
  3.       applicationFrame.size.height - kBottomMargin - kButtonHeight,  
  4.       applicationFrame.size.width - kLeftMargin - kRightMargin,  
  5.       kButtonHeight);  
  6. [acceptButton setTitle:NSLocalizedString(@"ButtonAcceptTermsOfService", @"") forStates:UIControlStateNormal];  
  7. [acceptButton addTarget:self action:@selector(termsOfServiceAccepted:) forControlEvents:UIControlEventTouchUpInside];  
  8. [self.view addSubview:acceptButton];  

当点击按钮后,就会调用相应的选择器并调用上述提到的AppDelegate中的方法。
 

  1. - (void)termsOfServiceAccepted:(id)sender  
  2. {  
  3.  id applicationDelegate = [[UIApplication sharedApplication] delegate];  
  4.  [applicationDelegate termsOfServiceAccepted];  


只显示一次
利用上述代码服务条例窗口会在每次程序启动的时候都显示。这会很烦人。我们需要加些代码来使其只在NSUserDefaults中的布尔中为YES的时候显示。.
 

  1. NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  2. if (![userDefaults boolForKey:TERMS_OF_USE_ACCEPTED]) {  
  3.  tosController = [[TermsOfServiceViewController alloc] init];  
  4.  [window addSubview:[tosController view]];  
  5.  navigationController.view.hidden = YES;  


在termsOfServiceAccepted方法中设置存储在NSUserDefaults内的布尔值。
 

  1. - (void)termsOfServiceAccepted  
  2. {  
  3.  tosController.view.hidden = YES;  
  4.  navigationController.view.hidden = NO;  
  5.  
  6.  // Store acceptance in UserDefaults  
  7.  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  
  8.  [userDefaults setBool:YES forKey:TERMS_OF_USE_ACCEPTED];  
  9. }  


这样只要用户点击接受按钮后服务条例窗体就不显示了。你的客户和法律顾问都会满意的。
原文出处:http://iphoneincubator.com/blog/windows-views/how-to-create-a-terms-of-service-screen