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.你回答了很多相关的建议。非常感谢。