SlideShare uma empresa Scribd logo
1 de 13
Baixar para ler offline
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];
}

Mais conteúdo relacionado

Mais de Tom Fan

Html5 history
Html5 historyHtml5 history
Html5 historyTom Fan
 
Geolocation
GeolocationGeolocation
GeolocationTom Fan
 
File api
File apiFile api
File apiTom Fan
 
Deviceaccess
DeviceaccessDeviceaccess
DeviceaccessTom Fan
 
Webstorage
WebstorageWebstorage
WebstorageTom Fan
 
Html5 最重要的部分
Html5 最重要的部分Html5 最重要的部分
Html5 最重要的部分Tom Fan
 
AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状Tom Fan
 
PhoneGap 2.0 开发
PhoneGap 2.0 开发PhoneGap 2.0 开发
PhoneGap 2.0 开发Tom Fan
 
Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发Tom Fan
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型Tom Fan
 
17 Localization
17 Localization17 Localization
17 LocalizationTom Fan
 
16 CoreData
16 CoreData16 CoreData
16 CoreDataTom Fan
 
15 Subclassing UITableViewCell
15 Subclassing UITableViewCell15 Subclassing UITableViewCell
15 Subclassing UITableViewCellTom Fan
 
14 Saving Loading and Application States
14 Saving Loading and Application States14 Saving Loading and Application States
14 Saving Loading and Application StatesTom Fan
 
13 UIPopoverController and Modal View Controller
13 UIPopoverController and Modal View Controller13 UIPopoverController and Modal View Controller
13 UIPopoverController and Modal View ControllerTom Fan
 
12 Camera
12 Camera12 Camera
12 CameraTom Fan
 
11 UINavigationController
11 UINavigationController11 UINavigationController
11 UINavigationControllerTom Fan
 
10 Editing UITableView
10 Editing UITableView10 Editing UITableView
10 Editing UITableViewTom Fan
 
09 UITableView and UITableViewController
09 UITableView and UITableViewController09 UITableView and UITableViewController
09 UITableView and UITableViewControllerTom Fan
 

Mais de Tom Fan (20)

Html5 history
Html5 historyHtml5 history
Html5 history
 
Geolocation
GeolocationGeolocation
Geolocation
 
File api
File apiFile api
File api
 
Deviceaccess
DeviceaccessDeviceaccess
Deviceaccess
 
Css3
Css3Css3
Css3
 
Webstorage
WebstorageWebstorage
Webstorage
 
Html5 最重要的部分
Html5 最重要的部分Html5 最重要的部分
Html5 最重要的部分
 
AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状AT&T 的 HTML5 策略和应用现状
AT&T 的 HTML5 策略和应用现状
 
PhoneGap 2.0 开发
PhoneGap 2.0 开发PhoneGap 2.0 开发
PhoneGap 2.0 开发
 
Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发Android 平台 HTML5 应用开发
Android 平台 HTML5 应用开发
 
HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型HTML5 生态系统和应用架构模型
HTML5 生态系统和应用架构模型
 
17 Localization
17 Localization17 Localization
17 Localization
 
16 CoreData
16 CoreData16 CoreData
16 CoreData
 
15 Subclassing UITableViewCell
15 Subclassing UITableViewCell15 Subclassing UITableViewCell
15 Subclassing UITableViewCell
 
14 Saving Loading and Application States
14 Saving Loading and Application States14 Saving Loading and Application States
14 Saving Loading and Application States
 
13 UIPopoverController and Modal View Controller
13 UIPopoverController and Modal View Controller13 UIPopoverController and Modal View Controller
13 UIPopoverController and Modal View Controller
 
12 Camera
12 Camera12 Camera
12 Camera
 
11 UINavigationController
11 UINavigationController11 UINavigationController
11 UINavigationController
 
10 Editing UITableView
10 Editing UITableView10 Editing UITableView
10 Editing UITableView
 
09 UITableView and UITableViewController
09 UITableView and UITableViewController09 UITableView and UITableViewController
09 UITableView and UITableViewController
 

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]; }