狠狠撸
Submit Search
18 NSUserDefaults
?
0 likes
?
439 views
Tom Fan
iOS 设置
Read less
Read more
1 of 13
Download now
Download to read offline
More Related Content
18 NSUserDefaults
1.
NSUserDefaults 范圣刚,princetoad@gmail.com,www.tfan.org
2.
? 很多应?用程序都包含?用户可以设置的?首选项 ? 这?一章我们将使?用
NSUserDefaults 类为 Whereami 增加?首选项功能,这个应?用将指定 MKMapView 的地图类型。
3.
更新 Whereami
4.
? 每?一个 MKMapView
都有?一个 mapType 的属性?用 来指定它应该显?示街道,卫星图像,还是都显 ?示。 ? 我们通过增加?一个 UISegmentedControl 来让?用户 切换地图类型。 ? ?用户的选择将被保存为?一个preference,下次应?用 再启动的时候,?首选的地图类型将会被显?示。
5.
? style =
Bar, Segement = 3 ? 建?立?一个outlet: mapTypeControl, ?一个 action: changeMapType
6.
? 在 WhereamiViewController.m
中实现 changeMapType: - (IBAction)changeMapType:(id)sender { switch ([sender selectedSegmentIndex]) { case 0: { [worldView setMapType:MKMapTypeStandard]; } break; case 1: { [worldView setMapType:MKMapTypeSatellite]; } break; case 2: { [worldView setMapType:MKMapTypeHybrid]; } break; default: break; } } ? 构建并运?行,应?用可以改变地图类型,但是下次启 动时不会记住
7.
使?用 NSUserDefaults
8.
? 我们可以使?用?一个 NSUserDefaults
的实例来保存 地图类型。 ? 每个应?用都有?一个 NSUserDefaults 的实例,并且 可以通过发送类消息 standardUserDefaults 到 NSUserDefaults 类来访问 ? NSUserDefaults 像字典?一样可以?用?一个 key 来访问 ?里?面的对象,并且在?用户第?一次访问它的时候会 ?自动读取,并且在有更改的时候会?自动写?入。
9.
? NSUserDefaults 的
key 总是 NSString 格式,?一个 key 就唯?一标识了?一个?首选项 ? ?首选项的值是?一个对象,这些值必须是基本类型 或者是 可序列化的属性列表类型
10.
? ?首先在 WhereamiViewController.m
顶部声明?一个 静态变量来持有地图类型的?首选项名字 NSString * const WhereamiMapTypePrefKey = @"WhereamiMapTypePrefKey"; @implementation WhereamiViewController
11.
? 然后再添加下?面的代码到 changeMapType:
中 ? Library/Preferences ??目录 - (IBAction)changeMapType:(id)sender { [[NSUserDefaults standardUserDefaults] setInteger:[sender selectedSegmentIndex] forKey:WhereamiMapTypePrefKey]; switch ([sender selectedSegmentIndex]) { case 0: { [worldView setMapType:MKMapTypeStandard]; } break; case 1: { [worldView setMapType:MKMapTypeSatellite]; } break; case 2: { [worldView setMapType:MKMapTypeHybrid]; } break; default: break; } }
12.
? 当我们的应?用第?一次发送 standardUserDefaults
时,将会把?首选项?文件从磁盘加载,更新我们的 viewDidLoad 来读取这个值,并相应的设置地图 类型 - (void)viewDidLoad { [super viewDidLoad]; ! // Do any additional setup after loading the view, typically from a nib. [worldView setShowsUserLocation:YES]; NSInteger mapTypeValue = [[NSUserDefaults standardUserDefaults] integerForKey:WhereamiMapTypePrefKey]; // 更新 UI [mapTypeControl setSelectedSegmentIndex:mapTypeValue]; // 更新地图 [self changeMapType:mapTypeControl]; } ? 构建并运?行,确认?一下重启的时候?首选项是否?生效
13.
? 通常我们要在?用户可能访问?首选项之前,先给我
们的?首选项注册?一个默认的值。 ? 这也就意味着是说我们要在 application delegate 的实例被创建之前 ? 重写 initialize 类?方法类为我们的?首选项注册?一个 默认的值 + (void)initialize { NSDictionary *defaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:WhereamiMapTypePrefKey]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; }
Download