Ios 通过更改其他视图中的设置来搜索NSFetchedResults

Ios 通过更改其他视图中的设置来搜索NSFetchedResults,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我已经阅读了很多内容,并观看了一些关于如何使用搜索栏搜索核心数据的教程,但是我还没有看到任何关于如何通过将设置从Settings视图传递到Table view来更改排序描述符的内容 我有一个searchbar按钮项,按下该项时,它会转到search设置svc。视图通过将布尔值从一个VC传递到另一个VC进行通信,反之亦然。问题是,通过更改TableVC顺序,表没有相应地对应(我尝试调用self.tableview beginUpdates、self.tableview reload、self-fe

我已经阅读了很多内容,并观看了一些关于如何使用搜索栏搜索核心数据的教程,但是我还没有看到任何关于如何通过将设置从
Settings
视图传递到
Table view
来更改排序描述符的内容

我有一个
search
bar按钮项,按下该项时,它会转到
search设置svc
。视图通过将布尔值从一个VC传递到另一个VC进行通信,反之亦然。问题是,通过更改TableVC顺序,表没有相应地对应(我尝试调用self.tableview beginUpdates、self.tableview reload、self-fetchedResultsController等)

重点是对TableVC结果重新排序,而不是像谓词那样只显示特定的结果

我为SettingsVC创建了一个委托,这样我就可以将布尔值传递给SettingsVC,如果有任何更改,SettingsVC就可以返回不同的更改值

问题是,我无法设法更新表视图(甚至无法预捕获已获取的结果)

以下是我的
-(NSFetchedResultsController*)fetchedResultsController
方法的代码:

// return if already initialized
if (self.fetchedResultsController != nil) {
    return self.fetchedResultsController;
}

if (dateSearch == true){

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    // the entity to fetch
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Details" inManagedObjectContext:managedObjectContext];
    // how to sort the data
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"addDate" ascending:YES];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                         managedObjectContext:managedObjectContext
                                                                           sectionNameKeyPath:nil
                                                                                    cacheName:nil];

    // fetch the data
    NSError *e = nil;
    if (![self.fetchedResultsController performFetch:&e]) {
        NSLog(@"fetch error(Date): %@", e );
        abort();
    }

    NSLog(@"Dates loaded");
}

if (mostAmount == true){

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    // the entity to fetch
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Details" inManagedObjectContext:managedObjectContext];
    // how to sort the data
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"amount" ascending:NO];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                         managedObjectContext:managedObjectContext
                                                                           sectionNameKeyPath:nil
                                                                                    cacheName:nil];

    // fetch the data
    NSError *e = nil;
    if (![self.fetchedResultsController performFetch:&e]) {
        NSLog(@"fetch error (Most Fuel): %@", e);
        abort();
    }

    NSLog(@"Amount loaded");

}

else{
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

    // the entity to fetch
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Details" inManagedObjectContext:managedObjectContext];
    // how to sort the data
    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"addDate" ascending:YES];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];

    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                        managedObjectContext:managedObjectContext
                                                                          sectionNameKeyPath:nil
                                                                                   cacheName:nil];

    // fetch the data
    NSError *e = nil;
    if (![self.fetchedResultsController performFetch:&e]) {
        NSLog(@"fetch error(Date): %@", e );
        abort();
    }

    NSLog(@"Defualt loaded");
}

return self.fetchedResultsController;
我需要一个默认值,因为在开始时,当我将TableVC中的布尔值初始化为false时,当我转到我的设置VC时,可以更新它们

我的SearchSettingsVC具有UI开关,可将值从true更改为false(反之亦然),从而成功更新表VC中的等效布尔值,如我返回SearchSettingsVC时所示

我的
prepareForSegue
表格中的代码

if ([[segue identifier] isEqualToString:@"searchSettings"]){
    //pass new search settings in here
    SearchSelectionSettings * settingsVC = (SearchSelectionSettings *)segue.destinationViewController;

    settingsVC.delegate = self;
    settingsVC.dateSearch = dateSearch;
    settingsVC.mostAmount = mostAmount;    
#pragma mark - SettingsViewControllerDelegate methods
//record the settings changed in the settings view
//dismissViewController changes the screen
- (void)closeSettings:(id)sender {

    NSLog(@"Working?");

    dateSearch = ((SearchSelectionSettings *)sender).dateSearch;
    mostAmount = ((SearchSelectionSettings *)sender).mostAmount;


     [self dismissViewControllerAnimated:YES completion:nil];
     [self FetchedResultsController];
     NSIndexPath * indexPath;
    [self tableView:self.tableView cellForRowAtIndexPath:indexPath];
}
这是我的closeSettings方法,它位于我的TableVC中

if ([[segue identifier] isEqualToString:@"searchSettings"]){
    //pass new search settings in here
    SearchSelectionSettings * settingsVC = (SearchSelectionSettings *)segue.destinationViewController;

    settingsVC.delegate = self;
    settingsVC.dateSearch = dateSearch;
    settingsVC.mostAmount = mostAmount;    
#pragma mark - SettingsViewControllerDelegate methods
//record the settings changed in the settings view
//dismissViewController changes the screen
- (void)closeSettings:(id)sender {

    NSLog(@"Working?");

    dateSearch = ((SearchSelectionSettings *)sender).dateSearch;
    mostAmount = ((SearchSelectionSettings *)sender).mostAmount;


     [self dismissViewControllerAnimated:YES completion:nil];
     [self FetchedResultsController];
     NSIndexPath * indexPath;
    [self tableView:self.tableView cellForRowAtIndexPath:indexPath];
}

将布尔值从一个VC传递到另一个VC非常有效。根据fetchedResults
语句更新TableView如果
语句没有更新,则SettingsVC中的my开关每次都会更新,不会出现任何问题。有人可以提供帮助或推荐教程吗?

fetchedResultscontrollergetter的开头几行,即:

// return if already initialized
if (self.fetchedResultsController != nil) {
    return self.fetchedResultsController;
}
这意味着,一旦创建了fetchedResultsController,访问它时将不会执行其余代码。因此,解决问题的快速方法是在
closeSettings
方法中将
self.fetchedResultsController
设置为
nil
,然后重新加载表视图。当tableview重新加载时,它将再次访问
fetchedResultsController
,由于它现在是
nil
,上述代码将被绕过并使用您的代码

#pragma mark - SettingsViewControllerDelegate methods
//record the settings changed in the settings view
//dismissViewController changes the screen
- (void)closeSettings:(id)sender {

    NSLog(@"Working?");

    dateSearch = ((SearchSelectionSettings *)sender).dateSearch;
    mostAmount = ((SearchSelectionSettings *)sender).mostAmount;


    [self dismissViewControllerAnimated:YES completion:nil];
    self.fetchedResultsController = nil;
    [self.tableView reloadData];
}
或者,您可以修改fetchedResultsController的fetch,然后让它重新形成fetch:

#pragma mark - SettingsViewControllerDelegate methods
//record the settings changed in the settings view
//dismissViewController changes the screen
- (void)closeSettings:(id)sender {

    NSLog(@"Working?");

    dateSearch = ((SearchSelectionSettings *)sender).dateSearch;
    mostAmount = ((SearchSelectionSettings *)sender).mostAmount;


    [self dismissViewControllerAnimated:YES completion:nil];
    NSFetchRequest *request = [[NSFetchRequest fetchRequestWithEntityName:@"Details"];
    NSSortDescriptor *sort;
    if (dateSearch == true){
        sort = [NSSortDescriptor sortDescriptorWithKey:@"addDate" ascending:YES];
        NSLog(@"Dates loaded");
    } else if (mostAmount == true) {
        sort = [NSSortDescriptor sortDescriptorWithKey:@"amount" ascending:NO];
        NSLog(@"Amount loaded");
    } else {
        sort = [NSSortDescriptor sortDescriptorWithKey:@"addDate" ascending:YES];
        NSLog(@"Default loaded");
    }
    [request setSortDescriptors:[NSArray arrayWithObject:sort]];
    self.fetchedResultsController.fetchRequest = request;
    // fetch the data
    NSError *e = nil;
    if (![self.fetchedResultsController performFetch:&e]) {
        NSLog(@"fetch error (Most Fuel): %@", e);
        abort();
    }
    [self.tableView reloadData];
}

这样,您就可以简化fetchedResultsController代码,使其只加载默认值。

如果我遇到您,我将很乐意为您购买饮料,原因如下:1。你的答案中的解决方案2奏效了。2.您给出了一个答案,并用代码进行了解释和演示(我发现这两者的结合并不常见,人们只是简单地给出了一个措辞明确的答案,而没有一个有效的答案)。3.你回答了很多相关的建议。非常感谢。