狠狠撸

狠狠撸Share a Scribd company logo
NSUserDefaults




范圣刚,princetoad@gmail.com,www.tfan.org
? 很多应?用程序都包含?用户可以设置的?首选项
? 这?一章我们将使?用 NSUserDefaults 类为 Whereami
 增加?首选项功能,这个应?用将指定 MKMapView
 的地图类型。
更新 Whereami
? 每?一个 MKMapView 都有?一个 mapType 的属性?用
 来指定它应该显?示街道,卫星图像,还是都显
 ?示。

? 我们通过增加?一个 UISegmentedControl 来让?用户
 切换地图类型。

? ?用户的选择将被保存为?一个preference,下次应?用
 再启动的时候,?首选的地图类型将会被显?示。
? style = Bar, Segement = 3
? 建?立?一个outlet: mapTypeControl, ?一个 action:
 changeMapType
? 在 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;
    }
}


? 构建并运?行,应?用可以改变地图类型,但是下次启
  动时不会记住
使?用 NSUserDefaults
? 我们可以使?用?一个 NSUserDefaults 的实例来保存
 地图类型。

? 每个应?用都有?一个 NSUserDefaults 的实例,并且
 可以通过发送类消息 standardUserDefaults 到
 NSUserDefaults 类来访问

? NSUserDefaults 像字典?一样可以?用?一个 key 来访问
 ?里?面的对象,并且在?用户第?一次访问它的时候会
 ?自动读取,并且在有更改的时候会?自动写?入。
? NSUserDefaults 的 key 总是 NSString 格式,?一个
 key 就唯?一标识了?一个?首选项

? ?首选项的值是?一个对象,这些值必须是基本类型
 或者是 可序列化的属性列表类型
? ?首先在 WhereamiViewController.m 顶部声明?一个
 静态变量来持有地图类型的?首选项名字
NSString * const WhereamiMapTypePrefKey = @"WhereamiMapTypePrefKey";

@implementation WhereamiViewController
? 然后再添加下?面的代码到 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;
    }
}
? 当我们的应?用第?一次发送 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];
}



? 构建并运?行,确认?一下重启的时候?首选项是否?生效
? 通常我们要在?用户可能访问?首选项之前,先给我
     们的?首选项注册?一个默认的值。

    ? 这也就意味着是说我们要在 application delegate
     的实例被创建之前

    ? 重写 initialize 类?方法类为我们的?首选项注册?一个
     默认的值

+ (void)initialize
{
    NSDictionary *defaults = [NSDictionary dictionaryWithObject:[NSNumber
numberWithInt:1] forKey:WhereamiMapTypePrefKey];

     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
}

More Related Content

18 NSUserDefaults

  • 2. ? 很多应?用程序都包含?用户可以设置的?首选项 ? 这?一章我们将使?用 NSUserDefaults 类为 Whereami 增加?首选项功能,这个应?用将指定 MKMapView 的地图类型。
  • 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; } } ? 构建并运?行,应?用可以改变地图类型,但是下次启 动时不会记住
  • 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]; }