首页 文章

核心数据,UITableView和UISegmentedControl

提问于
浏览
2

我是使用Core Data的新手,我正在使用UITableView . 我有一个带有UISegmentedController的工具栏,我想根据所选索引过滤UITableView中的项目 . 换句话说,假设我有一个显示Books(存储在Core Data中)的UITableView和一个带有段的UISegmentedController,以“English”,“Spanish”和“French”显示书籍 .

什么方法让一切都搞定了?单击其中一个段时,如何在UISegmentedControl的目标中进行更改?

对不起,如果这是一个愚蠢的问题!

4 回答

  • 0

    您可以使用 NSFetchedResultsController ,当您单击片段时,只需设置不同的perdicate并再次执行提取 .

  • 6

    我会为每个段使用单独的 NSFetchedResultsController . 这将允许您利用每个段的内置缓存并提高性能 .

    除了Apple的文档(和我的书)之外,您还可以从我在PragPub杂志上的文章_2662198中阅读它们 .

  • 0

    为每个过滤器使用三个不同的阵列是个好主意 . 将它们缓存到某处,以便在用户选择过滤器时无延迟 . 要从CoreData商店中查找您要查找的信息,请使用NSPredicate .

  • 0

    我使用上面Marcus的指南实现了这个(我是新手,所以它可能不是最好的方法) . 我有一个段控制器,有三个选项,分别用于'打开','进行中'和'关闭' .

    在ViewController.h中,为每个段选项创建一个iVar,为将存储当前控制器的主控制器创建一个iVar .

    @property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
    
    @property (nonatomic, retain) NSFetchedResultsController *inprogressFetchedResultsController;
    @property (nonatomic, retain) NSFetchedResultsController *openFetchedResultsController;
    @property (nonatomic, retain) NSFetchedResultsController *closedFetchedResultsController;
    

    在ViewController.m中,您需要为延迟加载这些控制器创建方法,所以我总共有三个 . 除了谓词和cacheName之外,它们基本相同,我只在下面显示了一个 .

    - (NSFetchedResultsController *)closedFetchedResultsController
    {
        if (_closedFetchedResultsController != nil) {
            return _closedFetchedResultsController;
        }
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ticket" inManagedObjectContext:self.managedObjectContext];
        [fetchRequest setEntity:entity];
    
        // Set the batch size to a suitable number.
        [fetchRequest setFetchBatchSize:20];
    
        // Edit the sort key as appropriate.
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"priority.name" ascending:NO];
        NSArray *sortDescriptors = @[sortDescriptor];
    
        [fetchRequest setSortDescriptors:sortDescriptors];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = 'Closed'"];
        [fetchRequest setPredicate:predicate];
    
        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"priority.name" cacheName:@"ClosedTickets"];
        aFetchedResultsController.delegate = self;
    
        self.closedFetchedResultsController = aFetchedResultsController;
    
        NSError *error = nil;
        if (![self.closedFetchedResultsController performFetch:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    
        return _closedFetchedResultsController;
    }
    

    为您的段创建一个IBAction,以便在更改它时更改获取的结果控制器并重新加载表 .

    - (IBAction)statusChanged:(id)sender {
        switch (self.segmentControl.selectedSegmentIndex) {
            case 0:
                self.fetchedResultsController = self.inprogressFetchedResultsController;
                break;
            case 1:
                self.fetchedResultsController = self.openFetchedResultsController;
                break;
            case 2:
                self.fetchedResultsController = self.closedFetchedResultsController;
                break;
            default:
                break;
    
        }
        [self.tableView reloadData];
    }
    

    而已!

    注:我还将此行添加到我的ViewDidLoad方法中,以便它最初将正确的选项加载到fetchedResultsController中 .

    self.fetchedResultsController = self.inprogressFetchedResultsController;
    

相关问题