• Like
18 NSUserDefaults
Upcoming SlideShare
Loading in...5
×

18 NSUserDefaults

  • 201 views
Uploaded on

iOS 设置

iOS 设置

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
201
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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:[senderselectedSegmentIndex] 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:[NSNumbernumberWithInt:1] forKey:WhereamiMapTypePrefKey]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];}