- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个简单的程序,它需要记录并持久存储每次用户在 TableView 中选择一个项目时生成的 2 条简单数据。这两条数据是 1) 点击的时间 (NSDate
) 和 2) 点击的项目的名称 (NSString
)。此时,这些信息是这样的形式:
TimerEvent *latestTappedEvent = [[TimerEvent alloc] init];
latestTappedEvent.timeTapped = NSDate.date;
latestTappedEvent.activityTapped = tappedItem.itemName;
这两个数据片段必须保持相互关联。
我的问题是:
如何按时间顺序将这些数据传入和传出 plist?
在我的研究中,我只会变得更加困惑。如何使用 plist 对我来说并不明显。最初,我认为我可以使用一个 NSMutableDictionary
,以 latestTappedEvent.timeTapped
作为键,以 latestTappedEvent.activityTapped
作为值。但是当我尝试手动构建 plist 时,它似乎是不可能的,而是想要一个字符串作为键。
如果有人能帮助我理解这一点,最好是通过图形表示这些不同元素之间的关系,我将永远感激不已。
最佳答案
字典和数组都存储“事物”——存储的事物是通过使用“其他事物”对数据结构进行“查找”来检索和设置的。在数组中,该查找是存储对象的数组中的索引。表格形式:
Index Storage
0 "some string stored at index 0"
1 "some other string"
2 <some other object, stored at index 2>
要查找 “存储在索引 0 处的一些字符串”
,您需要知道它存储在索引 0 处,并向数组询问该索引处的对象。所以数组使用整数来查找其中存储的对象,而这些整数必须在0到数组的计数减1的范围内。使用整数来查找数组中的项目也给出了数组顺序——从上到下- 您在上表中看到的底部排序与代码迭代产生的顺序相同。
字典使用任意对象进行查找,这也意味着字典中没有顺序,只有一组键及其所指的关联。表格形式:
Key Storage
"name" "a string that will be accessed using the key 'name'"
"number" <some numeric object, that will be accessed using the key 'number'>
<object> "will be accessed with key <object> which is an arbitrary object"
要从此字典中获取 “将使用键 'name' 访问的字符串”
,您向字典询问键 “name”
下存储的内容.
在上面的示例中,我给出了表标题“Index - Storage”或“Key - Storage”,但是回过头来看,这些结构都存储了可以使用其他东西访问的东西,让我们查看数组一个更通用的表格:
Thing used to access the thing that's stored Thing that's stored
0 "some string stored at index 0"
1 "some other string"
2 <some other object, stored at index 2>
同样,字典,具有相同的表格:
Thing used to access the thing that's stored Thing that's stored
"name" "a string that will be accessed using the key 'name'"
"number" <some numeric object, that will be accessed using the key 'number'>
<object> "will be accessed with key <object> which is an arbitrary object"
此外,让我们在同一个表中查看您的类 TimerEvent
:
Thing used to access the thing that's stored Thing that's stored
timeTapped <date object>
activityTapped "name of an activity"
左栏中的项目是 Objective-C 属性名称,右栏中的项目是这些属性包含的值。现在,再看一下字典——左边的项目是任意值(实际上它们通常是字符串),右边的项目是其他任意值。希望你能看到这里的联系——你通常可以将一个对象的属性表示为一个字典,它将属性名称的字符串表示映射到属性存储的值。所以,如果你想在字典中表示 TimerEvent
对象,你最终会得到如下表示:
Key Object
"timeTapped" <date object>
"activityTapped" "activity name"
上表说明了数组、字典和其他对象之间的共性和差异,并表明使用字典将属性名称映射到属性值可以表示任何给定对象的属性。那么,执行此操作的代码看起来如何?假设我们要在 NSDictionary
中表示 TimerEvent
对象 timerEvent
:
NSDictionary *timerEventRepresentation = @{ @"timeTapped": timerEvent.timeTapped,
@"activityTapped": timerEvent.activityTapped};
下面是我们如何根据字典表示创建 TimerEvent
:
TimerEvent *timerEvent = [[TimerEvent alloc] init];
timerEvent.timeTapped = timerEventDictionaryRepresentation[@"timeTapped"];
timerEvent.activityTapped = timerEventDictionaryRepresentation[@"activityTapped"];
将所有对象强制转换为字典的目的是属性列表格式仅序列化几个类 - NSArray
、NSDictionary
、NSString
、NSDate
、NSNumber
和 NSData
。因此,我们编写代码来使用受支持的类来表示不受支持的类,反之亦然,以在 plist 中序列化这些对象。
作为附录,您提到您需要存储所有点击的记录,并对它们进行排序。正如我上面提到的,数组本质上是对它们存储的东西进行排序,所以这是合适的解决方案。你会想要构建看起来像这样的东西:
Index Item
0 <dictionary representing first tap>
1 <dictionary representing second tap>
...
n <dictionary representing n-1th tap>
在代码中,序列化每个点击将采用与前面描述的相同的形式,但请确保添加一个额外的步骤,即在 NSMutableArray
属性上调用 addObject:
新创建的字典作为参数。
关于ios - plist、数组和字典的元素之间是什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19646775/
我的应用程序中有一个 PLIST 文件,其中包含各种配置数据。一些数据是用于访问服务器的 URL。该服务器为我们代码的几个不同版本托管 JSON 文件。我想要做的是在具有版本的 PLIST 文件中有一
我想制作一个从 plist 中检索数据的数据管理器类,我想知道我是否应该制作一个包含所有类方法的类,每次调用该方法并返回请求的值时读取 plist,或者创建一个类使用 plist 数据初始化数组(实例
我正在编写一个生成 .xcodeproj 文件的应用程序。它生成了一个 .pbxproj 文件,但是在 Xcode 中打开它时,我收到一条错误消息,“无法打开,因为无法解析项目文件。”仅此而已。 是否
要在 iPhone 中执行我的应用程序,首先我必须将配置文件添加到我的 iPhone 中。好的。但我不明白在资源下的 xCode 中的 iphone 应用程序中添加 entitlements.plis
我目前正在尝试从 Visual Studio Community 2017 为 MAC 运行与 Appium 集成的 C# NUnit 测试脚本。软件配置为 MAC OS- 10.12.6、Appiu
通过网络发送二进制 plist 比简单 plist 的优点是什么。另外,客户端处理二进制 plist 的速度有多快? 最佳答案 与 XML 格式的 plist 相比,它们通常要小得多,而且处理速度要快
我有一个如下图所示的 plist,那是我的主要 plist,其中 “bid” 字段是唯一的。我有出值(value) (例如 bid=90) 然后我需要在我的主(第一张图片)plist 的所有条目中搜索
如果不使用主包中 plist 上文件管理器实例的 .copyItemAtPath 方法,我将如何创建一个空的 plist 文件?我想检查我的 DocumentDirectory 中是否已经创建了一个
我在 ~/Library/LaunchAgents 有以下 plist 文件: Label com.yogapo.test_launchd Program
所以我知道如何让苹果邮件 9 始终加载远程内容,但我需要以编程方式设置该首选项。我正在查看苹果邮件 plist 文件,但似乎找不到值。有谁知道这个设置可能在哪里? 最佳答案 我不同意 ~/Librar
使用 MonoTouch 加载和处理“两级嵌套”plist 文件的最佳方式是什么?我有一个 plist 文件,其中的数据(结构上)类似于以下内容: - USA --- New York --- Chi
所以在我的最后一个问题中,我试图弄清楚我应该使用什么,Plist 或 Core data 或 sqllight,我决定尝试所有这些来提高我的技能。所以我开始阅读有关 plist 及其工作方式的文章,但
我有一个手动维护的属性列表,它定义了一组相同类型的对象。这些对象具有许多属性,其中之一是正则表达式字符串。一些对象共享一个通用的正则表达式,我的问题是我必须在文件的多个位置维护相同的正则表达式,这很容
-(NSString*)dataFilePath{ NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentD
我正在尝试让我的应用程序从电子邮件中将设置导入到自身中。这将起作用的方式是用户将向自己发送一个 settings.properties 文件,这实际上是一个看起来像这样的 plist
我在 Xcode 4.2 中有一个应用程序。 我已经根据需要创建了 plist 文件。 我已经从应用程序主包中找到数据并将数据放入数组中。 但是由于我想在运行时修改plist数据,所以在Documen
Apple 强烈建议在将基于 XML 的大型数据集读入 iPhone 应用程序时使用二进制 plist 格式。他们的理由之一是 XML 解析在 iPhone 上非常费力。但是,这需要首先转换驻留在远程
我在 Xcode build设置中启用了 Info.plist 的预处理,以用 version.h 中的相应值替换 CFBundleVersion 中表示版本号的键。这很好用:VERSION_NUMB
抱歉,帖子太长了。当我第二次使用 plist 中的字符串时,它使我的程序崩溃。我有 cocos2d 项目( attach ),其中有一个场景和一个对象。和一个 .plist 文件 HelloWorld
我已将新实体添加到现有 Plist。由于 Plist 不一致,新版本的应用程序崩溃。 如何将旧 plist 数据与新 plist 合并? 我的Plist创建方法如下 - (void)createEdi
我是一名优秀的程序员,十分优秀!