禁用添加对象的选项,该对象已经在从 NSUserDefaults 加载的数组中

Posted

技术标签:

【中文标题】禁用添加对象的选项,该对象已经在从 NSUserDefaults 加载的数组中【英文标题】:Disable the option to add an object that is already in an array that was loaded from NSUserDefaults 【发布时间】:2013-03-04 19:20:21 【问题描述】:

我正在将 plist 中的食谱加载到 NSArray(自定义对象的食谱)并在 UITableView 中显示它们。 我在详细视图中添加了一个选项,以将食谱添加到收藏夹视图。

显然我想要保存用户收藏夹选择的选项,因此我使我的自定义类符合 NSCoding 并将 initWithCoder 和 encodeWithCoder 方法添加到我的自定义对象中。

重新启动应用程序后,收藏夹数组已正确保存并重新加载。 问题是我可以在每次重新启动时添加相同的配方(在应用程序运行时我可以添加和删除配方就好了)。

有人可以帮我想出一种方法来禁用添加上一次运行应用程序时已添加的食谱的选项吗?

【问题讨论】:

【参考方案1】:

您可以使用[array containsObject:obj] 方法检查数组,还需要在您的类中实现正确的isEqual: 方法。

另外,您可以考虑使用NSSet 而不是NSArray,因为NSSet 在逻辑上比NSArray 更适合唯一的对象集。使用 NSSet,您仍然需要实现 isEqual:

【讨论】:

@Gobra 不使用 NSSet 是否意味着元素是无序的?如果我希望用户能够重新排序集合怎么办?如果顺序很重要怎么办? 这取决于重新订购类型。如果用户可以明确地上下移动项目 - 坚持使用 NSArray,如果它只是一种排序,我认为更容易保留排序描述并在控制器中应用排序。 谢谢,所以我会坚持使用 NSArray。【参考方案2】:

你可以让它们覆盖 -hash 和 -isEqual: 并使用一个集合......然后你可以尝试一遍又一遍地添加它们,这没关系,因为一个集合只包含一个......或者你可以继续使用数组并检查数组中的对象。

if ([someArray indexOfObject:someObj]==NSNotFound)

    [someArray addObject:someObj];

【讨论】:

以上是关于禁用添加对象的选项,该对象已经在从 NSUserDefaults 加载的数组中的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ Idea - 如何在从数据库表生成域对象时指定选项

在从不同模式调用过程时如何在 oracle 中查找所有嵌套的依赖对象

禁用 KendoUI 下拉列表选项

如何从对象中添加选择选项

在下拉列表中添加自定义对象作为选项

通过 jQuery 在选择菜单中添加禁用的选定选项