iphone dev - NSUserDefaults 检查布尔值是否存在

2024-03-14

我刚刚向我的应用程序添加了一个设置包,但在读取布尔设置时遇到问题。我知道,在启动应用程序时,除非用户实际输入设置,否则不会读取设置 - 这就是我想要捕获的内容。

但是,我的代码只是捕获答案是否为“否”或尚未设置的情况。我需要查明它们是否已设置,然后设置答案!

设置代码:

BOOL playSound;
BOOL playVibrate;


//test for some defaults
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs boolForKey:@"pref_sound"]) {
    playSound = YES;
    playVibrate = YES; 
} else {
    playSound = [prefs boolForKey:@"pref_sound"];
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
}


if (playSound) {
//do stuff
}

问题是,如果用户将设置设置为“NO”,代码就会将振动和声音更改为“yes” - 这意味着捕获“NOT”设置......

有任何想法吗?


首先你的程序有一个bugif有条件的。您正在检查布尔值本身,根据boolForKey:文档 http://developer.apple.com/Mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html#//apple_ref/occ/instm/NSUserDefaults/boolForKey:,如果尚未设置,将返回 NO。所以boolForKey:这不是正确的方法。

这是另外两个想法。

考虑使用另一个设置和另一个键来指定您的设置是否已初始化。当您启动应用程序或首次读取设置时请检查它。如果需要的话进行初始化。例如:

- (void) initializeUserDefaults {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if (nil == [defaults objectForKey:@"initialized_defaults"]) {
        [defaults setBool:YES forKey:@"pref_sound"];
        [defaults setBool:YES forKey:@"pref_vibrate"];
        [defaults setObject:@"dummy_value" forKey:@"initialized_defaults"];
    }
}

一个更简单的解决方案(但我不确定这是否有效)是将您的条件更改为:

if (![prefs objectForKey:@"pref_sound"]) {

我再次不知道这是否会达到我想象的效果,但我想objectForKey:将返回底层装箱布尔对象(如果存在),或者nil.

如果您在新版本的应用中添加新设置,您不希望新设置未初始化,也不希望破坏用户的现有设置。第二种方法毫不费力,而第一种方法更容易搞砸。但第一种方法还将所有设置收集在一个地方,这样您就可以看到它应该如何工作,这是我喜欢的。

但我不确定 ADC 文档会认为什么是最佳实践。为了找出答案,我建议您查看引用的任何代码示例NSUserDefaults类参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iphone dev - NSUserDefaults 检查布尔值是否存在 的相关文章

  • NSURL URLWithString:引发异常

    简而言之 NSURL URLWithString 似乎引发了一个例外 根据文档 如果字符串格式错误 则返回 nil 没有提到在任何情况下都会引发异常 除此之外 我还对 URL 进行编码并检查nil在将字符串转换为 URL 之前 任何人都可以
  • 如何在 iOS 中注册自定义文件类型

    我目前正在创建一个应用程序 我想让用户在其中备份他们的文件 plist m4a 我压缩文件并将扩展名更改为自定义扩展名 专门针对我的应用程序 例如 MyBackup 然后 用户可以通过电子邮件或 iTunes 文件共享进行导出 我已经阅读过
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 您将如何实现一个检测水平滑动以允许分页的 UITableView?

    我想实现一个 UITableView 一次显示 20 行 但考虑到我实际上可能要展示 120 个项目 我想使用某种分页来处理这个问题 使用前 20 项填充表 当用户从右向左滑动时 用接下来的 20 个项目重新加载 UITableView 从
  • Objective C 如何将文本字段添加到导航栏中

    我正在尝试将文本字段添加到导航栏中 但它没有显示在模拟器中 我在 viewdidload 中按如下方式执行 UITextView textField UITextView alloc initWithFrame CGRectMake 0 0
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • 设置 TableView setEditing 时无法选择 UITableViewCell

    我希望能够选择多行 如下所示的默认邮件应用程序 我有一个名为编辑的按钮 可以调用 self myTableView setEditing YES animated YES 编辑按钮成功显示单元格左侧的圆圈 如上所示的邮件应用程序 但是 当我
  • 如何消除禁用的 UIButton 的灰色外观

    我有一个 UIButton 我希望它处于禁用状态时与处于正常状态时看起来完全相同 现在它看起来有点灰色 不要使用enabled属性或setEnabled NO方法 而是使用 myButton setUserInteractionEnable
  • 如何将设备令牌和应用程序版本发送到服务器

    我已经实现将设备令牌和应用程序版本发送到 serverm 它在模拟器 硬编码数据 中工作正常 但在设备中无法工作 任何形式的帮助将不胜感激 先感谢您 这是代码 void application UIApplication applicati
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • 如何在 xcode 中使用相同的 nib 文件创建多个窗口

    我有一个使用表格视图作为界面的 iPhone 应用程序 每次用户点击其中一个表格单元格时 我想向用户显示另一个窗口 然而 我推入导航控制器的窗口的用户界面非常相似 因此 我决定制作一个 通用 nib 文件 以便在该通用 nib 文件的文件所
  • 自定义事件多久才会出现?

    我正在尝试使用 Flurry 将分析跟踪添加到 iPhone 应用程序 我已经连接了 Flurry 并且它似乎可以很好地跟踪会话和使用情况 但是 我刚刚尝试添加自定义事件日志 但每当我查看 Flurry 分析 事件 页面时 它都会告诉我 您
  • 如何在 IOS safari 上禁用缓存?

    有没有办法禁用 ipad iphone 上的缓存 我想针对非缓存体验运行一些自动化测试 我刚刚偶然发现了一种在 iOS 上禁用 Safari 缓存的方法 iOS Open Settings 导航Safari gt 高级 Enable 网页检
  • 访问 UserDefault 数组 URL 以填充 CollectionView

    这是上一篇文章的后续内容here https stackoverflow com questions 48142238 save and append an array in userdefaults from imagepickercon
  • 有没有办法在iOS模拟器上使用苹果的Touch ID(指纹扫描仪)?

    我正在开发一个需要 Touch ID 身份验证的应用程序 那么有什么方法可以在模拟器中使用 Touch ID 指纹扫描仪 另外 请分享一些使用 LocalAuthentication 框架的示例代码 XCODE 7 beta支持在iPhon
  • 如何为整个 iOS 应用程序设置自定义字体而不指定大小

    我正在尝试在整个我的应用程序中应用自定义字体iOS app 我发现我可以使用 UILabel appearance setFont UIFont fontWithName Proxima Nova size 17 0 设置所有的默认字体和大
  • 了解 Etc/GMT 时区

    Apple 在从 App Store 返回自动续订订阅收据时使用 Etc GMT 时区的理由是什么 Etc GMT 时区到底是什么 Java SDK 能理解这个时区吗 或者我是否必须使用其他第三方库 例如乔达时间 http www joda
  • CAKeyFrameAnimation 中的 keyTime 是什么样的值?

    例如我有这个 CAKeyFrameAnimation CALayer theLayer myView layer CAKeyframeAnimation animation animation CAKeyframeAnimation ani
  • 使 html svg 对象也成为可点击的链接(在 iPhone 上)

    这个问题与使 html svg 对象也成为可点击的链接 https stackoverflow com q 11374059 4825796 但给出的答案似乎不适用于 iPhone ios 9 3 safari 和 chrome 浏览器 我

随机推荐

  • 将 Laravel 事件订阅者排队

    我通过事件订阅者处理多个事件 而不是创建单独的事件 侦听器 我想对其中几个事件进行排队 但我还没有找到实现这一目标的方法 我已经关注官方了文档 https laravel com docs 5 2 events event subscrib
  • 如何获取适用于 Xcode 3.2 的 iPhone SDK 2.2.1?

    在我升级到 Snow Leopard 和 Xcode 3 2 后 我真的很后悔 Xcode 丢失了所有的 SDK 我是那些仍然想开发 2 2 1 的老式白痴之一 但苹果不向我提供旧的 SDK 下载 现在我很聪明 做了很多时间机器备份 但是
  • 在 .NET 中检测 3G 互联网连接

    我们的应用程序使用 RSS 从互联网下载数据 但在连接 3G 的计算机上出现连接问题 我们想要检测 3G EDGE GPRS 连接 以便我们可以更改应用程序行为 显示警告或连接状态 这将如何完成 The NetworkInterface h
  • Linkedin Ads API “dateRange”请求参数的格式是什么?

    dateRange 的正确格式是什么rest liv2 文档中当前的示例不支持它 我不明白rest li文档 确切地说 它的格式是什么 这是我提出的要求 Headers X Restli Protocol Version 2 0 0 Aut
  • 如何在 IntelliJ 中使用拖放来实现 java swing

    我正在使用 IntelliJ 使用 swing 进行 java 应用程序开发 使用布局管理器管理内容很困难 那么 是否有任何工具可以像 Visual Studio for vb net 一样提供拖放功能 您可以使用 IntelliJ GUI
  • 本地化 Laravel

    我一直在尝试更新网站的语言 控制器 public function getUpdateLanguage Request request request data request gt all Session put locale reque
  • 如何获取当前类的类型?

    这有点难以解释 但我到处都找过了 但找不到任何好的答案 我还看到了 Stack Overflow 的问题如何引用 Java 中接口实现的类类型 https stackoverflow com questions 8161712 how ca
  • #include 在 main() 函数中

    我想知道里面是否有可能main 来自 C 的函数来包含一些东西 例如 在 Cell 程序中 我定义了 cache api h 的参数 稍后将在main 我想改变的功能 我明白什么是定义的 define可以是未定义的 undef程序中的任何位
  • OmniAuth::NoSessionError - 您必须提供会话才能使用 OmniAuth。 (在设备中配置)

    您好 我正在学习如何使用omniauth 作为 ember 应用程序的后端 当我运行我的应用程序时 我收到下面提到的错误 OmniAuth NoSessionError 您必须提供会话才能使用 OmniAuth 在救援轨道上 我的应用程序在
  • 如何使这个 JS 函数异步?

    function takesTime for var i 0 i
  • AVFoundation 根据预览宽高比裁剪捕获的静态图像

    我的问题与这个问题大多相似 裁剪 AVCaptureSession 捕获的图像 https stackoverflow com questions 5780580 cropping image captured by avcapturese
  • 我如何将 pack uri 资源与媒体播放器一起使用?

    我有一些非常简单的代码 只需要播放指定音量的声音 如下所示 var mp new MediaPlayer mp Open uri mp Volume volume mp Play 出现问题是因为这是 Prism 模块的一部分 我不知道执行程
  • spring security的配置问题

    我有 Spring Security 应用程序 以下是我的 security context xml
  • 列表理解中的“with”关键字? [复制]

    这个问题在这里已经有答案了 我遇到了这种用于读取文件中的行的语法 with open as f for line in f
  • 使用 TFS API 检测文件删除更改(自动,无需 VS 交互)

    我在 tfs 工作区中有一个本地文件夹并使用 TFS API 每天晚上我都会删除这个文件夹 然后将数据库脚本编写为 sql 文件 如果现在添加或编辑了某些内容 则会找到更改并进入待处理的更改以进行签入 问题是我如何使用 TFS API 检测
  • Python将字符串转换为变量名

    我知道这可能会出现重复 但到目前为止我还没有找到 或者应该理解 我正在寻找的答案 我有一个字符串列表 想要将每个字符串转换为一个变量名 然后为其分配一些内容 我知道我可能需要一个字典 但我对它们不熟悉 因为我对 python 相对较新 并且
  • Android wifimanager总是返回true

    这简直要了我的命 任何帮助将不胜感激 我想使用 wifi 管理器连接到开放网络 我遇到的问题是该代码声称连接到任何网络 甚至是不存在的网络 下面是执行并使用网络 SSID 调用的完整代码 无论您传递给它什么字符串作为网络的 SSID 即使不
  • 是否可以释放静态定义的数组?

    您可以释放使用静态分配定义的数组的内存吗 不 这是不可能的取消分配静态分配的内存 根据语言 例如 C C 使用指针 您也许可以将此数组所持有的内存用于其他目的 但这样做只会re use记忆 内存不会被释放per se 也就是说 将静态内存与
  • 调用基类构造函数而不命名其类

    class MyDerived public Incredble
  • iphone dev - NSUserDefaults 检查布尔值是否存在

    我刚刚向我的应用程序添加了一个设置包 但在读取布尔设置时遇到问题 我知道 在启动应用程序时 除非用户实际输入设置 否则不会读取设置 这就是我想要捕获的内容 但是 我的代码只是捕获答案是否为 否 或尚未设置的情况 我需要查明它们是否已设置 然