任何人都知道如何使表索引成为我的核心数据名称属性的前 4 个字符?

Posted

技术标签:

【中文标题】任何人都知道如何使表索引成为我的核心数据名称属性的前 4 个字符?【英文标题】:Anyone know how to make the table index the first 4 chars of my core data name attribute? 【发布时间】:2011-07-04 22:30:25 【问题描述】:

我正在开发一个硬币应用程序。硬币在由 Core Data 管理的表格视图中呈现给用户。

所有硬币名称都以“19”或“20”开头。当我在表视图上实现部分索引时,我的索引中只得到一个“1”和一个“2”。按“1”将桌子移动到“1900”硬币,按“2”将我带到“2000”硬币。我知道这是为什么,它来自名称字段中的第一个数字。

我想要的是“1910”、“1920”、“1930”等,这样用户就可以跳转到十年。

我在模型中添加了一个名为“titleForSection”的属性,并输入了“1910”、“1920”等,并在我的获取请求中将 sectionNameKeyPath 设置为我的@“titleForSection”属性。不用说,它不起作用。

有谁知道如何将部分索引设置为 name 属性的前 4 位?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

    return [[fetchedResultsController sections] count];



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

    if (self.searchIsActive) 
        return [self.filteredListContent count];
    

    NSInteger numberOfRows = 0;

    if ([[fetchedResultsController sections] count] > 0) 
        id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
        numberOfRows = [sectionInfo numberOfObjects];
    

    return numberOfRows;





//for index
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 

    return [fetchedResultsController sectionIndexTitles];




- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

    return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];


- (NSFetchedResultsController *)fetchedResultsController 

    if (fetchedResultsController != nil) 
        return fetchedResultsController;

    

    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Coins" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    //set batch size
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"sortOrder" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"titleForSection" cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    return fetchedResultsController;

更新:

我将“titleForSection”属性从字符串更改为数字,然后将数据库从 1900 年一直填充到 2010 年,以十年为单位。现在我的表索引只显示“0”、“1”和“2”。我只是不明白为什么我不能在那里输入一个数字!

【问题讨论】:

【参考方案1】:

你应该在 UITableViewController 中覆盖– sectionIndexTitlesForTableView:,试试这样:

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
    NSMutableArray *array = [[NSMutableArray alloc] init];
    [array addObject:@"1920"];
    [array addObject:@"1930"];
    [array addObject:@"1940"];
    [array addObject:@"1950"];
    [array addObject:@"1960"];
    [array addObject:@"1970"];

    return array;

您可能感兴趣的第二种方法:

– tableView:sectionForSectionIndexTitle:atIndex:

【讨论】:

是的,但是当它的索引被按下时,表怎么知道跳转到 1940 呢?是什么让他们“排队”? 这个数组中的第一个对象跳转到第一行,第二到第二,第三到第三等等,所以如果这个数组太小你将无法跳转到最后一行。 是的,这个表有350条记录。所以我不想那样做。另外,如果用户删除了一行,那么它就会消失。 有什么问题?只需生成此数组并在用户插入/删除行时更改它【参考方案2】:

只需为您的硬币类创建一个新方法:

-(NSString*)firstFourCharsOfTitle

    return [[self titleForSection] substringToIndex:4];

然后在 NSFetchedResultsController init 中将该方法用于“sectionNameKeyPath”

NSFetchedResultsController *aFetchedResultsController = 
     [[NSFetchedResultsController alloc] 
           initWithFetchRequest:fetchRequest 
           managedObjectContext:managedObjectContext 
             sectionNameKeyPath:@"firstFourCharsOfTitle" 
                      cacheName:nil];

【讨论】:

以上是关于任何人都知道如何使表索引成为我的核心数据名称属性的前 4 个字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据模型iOS中找出特定属性索引的值

更新核心数据的特定属性

如何添加和查看核心模型关系的数据

基于核心数据属性的 UITableView 部分

从 Python 更新 BigQuery 表属性会使表消失

索引日期类型的核心数据属性是不是有意义?