NSFetchedResultsController 与 NSFetchedResultsController 对比UILocalizedIndexedCollat​​ion

2024-01-02

我正在尝试将 FRC 与混合语言数据一起使用,并希望有一个部分索引。

从文档看来,您应该能够覆盖 FRC

- (NSString *)sectionIndexTitleForSectionName:(NSString *)sectionName
- (NSArray *)sectionIndexTitles

然后使用 UILocalizedIndexedCollat​​ion 获得本地化索引和部分。但遗憾的是这不起作用,也不是预期用途:(

有没有人能够将 FRC 与 UILocalizedIndexedCollat​​ion 一起使用,或者我们被迫使用示例 UITableView + UILocalizedIndexedCollat​​ion 示例中提到的手动排序方法(示例代码包含在我工作的地方)。

使用以下属性

@property (nonatomic, assign) UILocalizedIndexedCollation *collation;
@property (nonatomic, assign) NSMutableArray *collatedSections;

和代码:

- (UILocalizedIndexedCollation *)collation
{
    if(collation == nil)
    {
        collation = [UILocalizedIndexedCollation currentCollation];
    }

    return collation;
}

- (NSArray *)collatedSections
{
    if(_collatedSections == nil)
    {
        int sectionTitlesCount = [[self.collation sectionTitles] count];

        NSMutableArray *newSectionsArray = [[NSMutableArray alloc] initWithCapacity:sectionTitlesCount];
        collatedSections = newSectionsArray;
        NSMutableArray *sectionsCArray[sectionTitlesCount];

        // Set up the sections array: elements are mutable arrays that will contain the time zones for that section.
        for(int index = 0; index < sectionTitlesCount; index++) 
        {
            NSMutableArray *array = [[NSMutableArray alloc] init];
            [newSectionsArray addObject:array];
            sectionsCArray[index] = array;
            [array release];
        }


        for(NSManagedObject *call in self.fetchedResultsController.fetchedObjects)
        {
            int section = [collation sectionForObject:call collationStringSelector:NSSelectorFromString(name)];
            [sectionsCArray[section] addObject:call];
        }

        NSArray *sortDescriptors = self.fetchedResultsController.fetchRequest.sortDescriptors;
        for(int index = 0; index < sectionTitlesCount; index++) 
        {
            [newSectionsArray replaceObjectAtIndex:index withObject:[sectionsCArray[index] sortedArrayUsingDescriptors:sortDescriptors]];
        }
    }
    return [[collatedSections retain] autorelease];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    // The number of sections is the same as the number of titles in the collation.
    return [[self.collation sectionTitles] count];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    // The number of time zones in the section is the count of the array associated with the section in the sections array.
    return [[self.collatedSections objectAtIndex:section] count];
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
    if([[self.collatedSections objectAtIndex:section] count])
        return [[self.collation sectionTitles] objectAtIndex:section];
    return nil;
}


- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self.collation sectionIndexTitles];
}


- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [self.collation sectionForSectionIndexTitleAtIndex:index];
}

我希望仍然能够使用 FRCDelegate 协议来获取更新通知。似乎没有什么好的方法可以让这两个对象很好地协同工作。


由于您无法对瞬态属性进行排序,因此我实施的解决方案是......

  1. 为核心数据模型中每个实体内的每个可排序属性创建一个名为“sectionKey”的字符串属性。 sectionKey 属性将是从基本属性(例如名称或标题属性)派生的计算值。它必须被持久化,因为(当前)瞬态属性不能在获取请求的排序描述符中使用。对将提供排序的每个sectionKey 和基本属性启用索引。为了将此更新应用于现有应用程序,您将需要执行轻量级迁移,并且还包括更新预先存在的数据库的例程。

  2. 如果您正在播种数据(例如,用一组标准数据填充新安装,或者为每种目标语言创建本地化 SQLite 数据库,其中一个数据库将在首次启动时复制),请在该代码中计算并更新每个目标语言实体的sectionKey 属性。对于播种数据的“最佳”方法有不同的看法,但值得注意的是,每种语言的少数 plist 文件(通常范围从几个字节到 20k,即使是由数百个值组成的列表)也会留下比每种语言的单个 SQLite 数据库(每种语言起价约为 20k)的总体占用空间要小得多。另外,可以将 Microsoft Excel for Mac 配置为通过启用语言功能 (3) 来提供列表的本地化排序。

  3. 在获取的结果控制器构造函数中,对sectionKey 和base 属性进行排序,并传递sectionKey 作为节名称键路径。

  4. 添加计算逻辑以更新所有添加或编辑用户输入中的sectionKey属性,例如,在textFieldDidEndEditing:中。

就是这样!无需手动将获取的对象划分为数组的数组。 NSFetchedResultsController 将为您进行本地化排序。例如,对于中文(简体),获取的对象将按语音发音进行索引(4)。

(1) 来自 Apple IOS 开发者库 > 国际化编程主题 >国际化和本地化 https://developer.apple.com/library/ios/#documentation/MacOSX/Conceptual/BPInternational/Articles/InternatAndLocaliz.html。 (2) 3_SimpleIndexedTableView的表视图套件 http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html. (3) 如何在 Microsoft Office for Mac 中启用中文功能 http://mac2.microsoft.com/help/office/14/en-us/word/item/c53ed219-462d-485a-b4f3-c3bd906874a1。 (4) 汉语通常按笔画或拼音排序。

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

NSFetchedResultsController 与 NSFetchedResultsController 对比UILocalizedIndexedCollat​​ion 的相关文章

  • 调试从 .NET Framework 升级到 .NET 6 后突然出现的命令行参数

    我将一个项目从 NET Framework 4 7 2 升级到 NET 6 当我在 Visual Studio 调试器中运行该程序时 出现意外参数 称为foo 被传递给Program Main 哪里foo来自 项目属性 Debug页面不显示
  • 如果单元格以文本字符串开头...公式

    我有一个公式 用于检查单元格是否以文本 A 开头返回 拾取 B 代表收集 和 C 代表预付 但它似乎不能正常工作 A 和 C 均返回预付费 LOOKUP LEFT A1 A B C Pick Up Collect Prepaid 我不知道l
  • ASP.NET 入口点?

    刚刚创建了一个空白的 ASP NET Web 应用程序 切入点在哪里 我看到 Default aspx 似乎是调用的默认模板 我猜 Site Master 充当布局文件 Global asax 似乎提供了一些用于事件处理的方法存根 然后是
  • PSQLException:错误:关系“TABLE_NAME”不存在

    我正在尝试在 PostgreSQL 8 4 2 DB 上运行休眠 每当我尝试运行简单的java代码时 例如 List
  • 在IOS5中实现SIP功能

    我想构建一个 iPhone 应用程序 它可以选择通过 SIP VoIP 拨打电话 但目前我不知道如何开始 有谁有关于这个主题的一些信息 或者可能有一个我可以用来实现 SIP 功能的演示项目 提前致谢 你前面还有一条漫长而有趣的路 您需要选择
  • Angular2 http.post 被执行两次

    我遇到一个奇怪的问题 Angular2 的 RC1 Http 服务执行 http post 调用两次 我已经调试了我的应用程序 并且我知道这不是点击事件问题 导致核心服务调用的所有调用 public create json Object p
  • RIMM 流文件格式中各个帧的格式是什么

    我正在尝试从黑莓设备捕获一些视频帧并将其作为图像进行操作 特别是进行条形码解码 我找到了一些示例代码和规范文档 其中演示了如何使用 J2ME MMAPI 类将视频从设备的摄像头流式传输到文件和输出流 流媒体文件采用 RIM 专有的 RIMM
  • 跳过一行GridBagLayout

    我在 JFrame 上使用 GridBagLayout 我希望能够跳过一两行 但将这些行显示为空白 然后在这些行后面有一个按钮 我在文档中找不到任何方法来执行我所描述的操作 有谁知道我可以执行此操作的任何方法吗 发现它比添加空组件干净得多
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数
  • 获取不正确的日期,将时间戳转换为新日期

    我正在尝试将时间戳转换为日期 但得到的日期不正确 我正在开发一个使用 Angular 和 Typescript 的项目 我有这样的时间戳 1451642400 2016年1月1日 和1454320800 2016年2月1日 如果我编码 da
  • 如何通过 jQuery onblur 提交表单

    所以我尝试通过 jQuery onblur 提交表单 即一旦焦点离开密码字段 表单就会通过 jQuery 提交 有类似的问题 但这不是我要找的 我尝试使用 document getElementById 但它不起作用 任何帮助表示赞赏 提前
  • Linux Bash grep 从匹配字符串中提取单词

    我有以特殊字符开头的数字 并以900现在我想提取排除它们之间的文本 我的代码 gt gt cat demo txt asdfsdf 1234900 asdf dfasd asdf 1345900 asdfad wer 678900 asdf
  • 尝试访问从资产复制到数据\数据\的数据库中的DatabaseHelper时出现空指针异常

    我有一个数据库助手类 代码如下 这个助手的类任务是将数据库从应用程序附带的资产文件夹复制到我的应用程序的 data data 中 以便我可以使用它 一旦我将数据库放入 data data 我能够 我想添加它并执行 CRUD 操作 并且该数据
  • 如何在 Jetpack Compose 中提供相对大小

    我有一个框布局 我想相对于父框的大小来布局子视图 这可以在 SwiftUI 中使用 Geometry Reader 来实现 如何在 Jetpack Compose 中实现类似的功能 您可以使用BoxWithConstraints代替Box
  • SQL 中 NOT 和 != 运算符有什么区别?

    有什么区别NOT and SQL 中的运算符 我无法理解其中的区别 我猜他们是一样的 NOT negates以下条件 因此它可以与各种运算符一起使用 is the 非标准替代品 https stackoverflow com a 10650
  • gwt - 在 RPC 调用中使用 List

    我有一个 RPC 服务 方法如下 public List
  • KeyboardAvoidingView“行为”中的高度与位置与填充

    KeyboardAvoidingView 中有一个 行为 属性 例如 import KeyboardAvoidingView from react native
  • 在 Android 上使用 pocketsphinx 未检测到关键字

    谁能解释一下如何使用 pocketsphinx 将语音转换为文本 我试试这个 import com example speechtutor SpeechRecognizerRecorder import com example speech
  • 关闭 IPython Notebook 中的自动保存

    我正在寻找一种方法来关闭 iPython 笔记本中的自动保存 我已经通过 Google Stack Overflow 搜索看到了有关如何打开自动保存的参考资料 但我想要相反的内容 关闭自动保存 如果这是可以永久设置的东西而不是在每个笔记本的
  • “保留供任何使用”是什么意思?

    注意 这是一个c questions tagged c问题 虽然我补充说c questions tagged c 2b 2b如果某些 C 专家可以提供 C 使用与 C 不同的措辞的基本原理或历史原因 在 C 标准库规范中 我们有这个规范文本

随机推荐