• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

iphone - 学习归档

[复制链接]
菜鸟教程小白 发表于 2022-12-12 13:36:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试保存和加载一个简单应用程序的设置。但是我对 obj-c 还是新手。我确实相信保存部分正在工作,但不是加载部分。当我更改设置时,按返回并重新进入设置 View ,设置未加载。

我认为这与使用保存的数据创建 SettingsViewController 的方式有关,但我无法理解它。

下面是来自 SettingsViewController 的有趣代码,下面是来自 MainWindowViewController 的代码

设置 View Controller :

-(id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)nibBundleOrNil{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if(self)
    {
        NSString * path = [self settingsArchivePath];

        self = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        shakeSwitch.on = shakeForTag;
        [warningDistanceFld setText:[NSString stringWithFormat"%i",warningDistance]];

}
return self;
}

-(id)initWithCoderNSCoder *)aDecoder{
    self = [super initWithNibName"SettingsViewController" bundle:nil];
    if(self)
    {
        [self setShakeForTag:[aDecoder decodeBoolForKey"shakeForTag"]];
        [self setWarningDistance:[aDecoder decodeIntForKey"warningDistance"]];
        [self setMapType:[aDecoder decodeIntegerForKey"mapType"]];
    }
    return self;
}

-(void)encodeWithCoderNSCoder *)aCoder
{
    [aCoder encodeInt:warningDistance forKey"warningDistance"];
    [aCoder encodeBool:shakeForTag forKey"shakeForTag"];
    [aCoder encodeInteger:mapType forKey"mapType"];
}

-(NSString *)settingsArchivePath
{
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,    NSUserDomainMask, YES);
    NSString * documentDirectory = [documentDirectories objectAtIndex:0];
    return [documentDirectory stringByAppendingPathComponent"settings.archive"];
}

-(IBAction)backid)sender
{

    if([mapChanger selectedSegmentIndex] == 0){
        mapType = MKMapTypeSatellite;
    }else if([mapChanger selectedSegmentIndex] ==1){
        mapType = MKMapTypeHybrid;
    }else{
        mapType = MKMapTypeStandard;
    }

    NSString *warning = [warningDistanceFld text];
    warningDistance = [warning intValue];
    shakeForTag =shakeSwitch.on;

    [self saveChanges];

    [self dismissViewControllerAnimated:YES completion:nil];
}

-(BOOL)saveChanges
{
    NSString *path = [self settingsArchivePath];
    NSLog(@"saved");
   return [NSKeyedArchiver archiveRootObject:self toFile:path];
}

MainWindowViewController 中用于初始化 settingsViewController 的代码:

svc = [[SettingsViewController alloc]initWithNibName"SettingsViewController" bundle:[NSBundle mainBundle]];

svc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:svc animated:YES completion:nil];



Best Answer-推荐答案


使用 NSKeyedArchiver 来保存简单应用程序的设置有点矫枉过正。

Foundation 框架提供了 NSUserDefaults 类,使用起来更方便。
这是适用于 iOS 或 OS X 的方法。

它将使用您的设置在正确的位置写入一个 plist 文件。

写东西基本上是:

[ [ NSUserDefaults standardUserDefaults ] setBool: YES forKey: @"SettingsKey" ];
[ [ NSUserDefaults standardUserDefaults ] setInteger: 42 forKey: @"SettingsKey" ];
[ [ NSUserDefaults standardUserDefaults ] synchronise ];

最后一行确保数据写入磁盘。它不是强制性的,因为它会定期自动调用,但显式调用它通常更安全。

获取数据基本上是:

[ [ NSUserDefaults standardUserDefaults ] boolForKey: @"SettingsKey" ];
[ [ NSUserDefaults standardUserDefaults ] integerForKey: @"SettingsKey" ];

NSUserDefault 可以管理很多数据类型。整数、 bool 值、 float ,还有数组(NSArray)、字典(NSDictionary)、数据(NSData)等 p>

另请注意,您可以从现有 plist 文件(即在您的应用资源中)加载默认设置:

[ [ NSUserDefaults standardUserDefaults ] registerDefaults: [ NSDictionary dictionaryWithContentsOfFile: @"path/to/plist" ] ];

关于iphone - 学习归档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18244536/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap