Фильтр TableView с помощью запроса из другого представления
Я хочу фильтровать данные в моем TableView с помощью switch. Я использую синтаксический анализ. Допустим, у меня есть TableViewController и FilterViewController (обычный класс ViewController). Я хочу отфильтровать данные, включив некоторые из них. И показать отфильтрованный TableView после нажатия кнопки Готово. У меня уже есть некоторые идеи, но я не знаю, как установить изменение в TableViewController.
Спасибо

Фильтр.h
@protocol ViewControllerDelegate;
@interface FiltrViewController : UIViewController
{
IBOutlet UISwitch *switch1;
IBOutlet UISwitch *switch2;
IBOutlet UISwitch *switch3;
IBOutlet UISwitch *switch4;
IBOutlet UISwitch *switch5;
IBOutlet UISwitch *switch6;
IBOutlet UIBarButtonItem *button1;
IBOutlet UILabel *label;
}
@property (nonatomic, weak) id<ViewControllerDelegate> delegate;
@property (nonatomic, strong) PFObject *obj;
@property(nonatomic,strong) NSArray *keys;
+ (void) filter:(id<ViewControllerDelegate>)delegate;
-(IBAction)buttontouched:(id)sender;
-(IBAction)switch1:(id)sender;
@end
@protocol ViewControllerDelegate < NSObject>
-(void)filter;
@end
Фильтр.m
@interface FiltrViewController (){
NSMutableDictionary* configG;
}
@property (retain) NSMutableDictionary* configG;
@end
@implementation FiltrViewController
@synthesize delegate;
@synthesize configG;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
configG = [[NSMutableDictionary alloc] init];
}
return self;
}
-(void)filter
{
PFQuery *query = [PFQuery queryWithClassName:@"Countries"];
NSArray *keys = @[ @"Africa", @"Europe", @"South America", @"North America", @"Asia", @"Australia" ];
NSArray *defaultValues = @[ @YES, @YES, @YES, @YES, @YES, @YES ];
NSMutableDictionary *config = [NSMutableDictionary dictionaryWithObjects:defaultValues forKeys:keys];
NSSet *filter = [config keysOfEntriesPassingTest:
^BOOL (id key, NSNumber *value, BOOL *stop) {
return [value boolValue];
}];
[query whereKey:@"DescriptTitle" containedIn:[filter allObjects]];
self.keys = keys;
self.configG = config;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(IBAction)buttontouched:(id)sender;
{
[self dismissViewControllerAnimated:YES completion:nil];
[delegate filter];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)switch1:(UISwitch *)sender
{
[self.configG setObject:@([sender isOn]) forKey:[self.keys objectAtIndex:sender.tag]];
}
@end
TableView.m
- (void)FilterTable:(FiltrViewController *)viewController didChooseValue:(CGFloat)value {
[FiltrViewController filter:self];
}
Метод фильтрации
- (void)filterController:(FilterViewController *)controller didEditConfig:(NSMutableDictionary *)config
{
NSSet *filter = [config keysOfEntriesPassingTest:
^BOOL (id key, NSNumber *value, BOOL *stop) {
return [value boolValue];
}];
PFQuery *query = [PFQuery queryWithClassName:@"Countries"];
[query whereKey:@"DescriptTitle" containedIn:[filter allObjects]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
//How can I pass filtered objects from Filter.m back into my TableView?
[self.MainTable reloadData];
NSLog(@"%u", objects.count);
}else{
}
}
];
1 ответ:
Как правило, вы не хотите выполнять несколько запросов в фоновом режиме каждый раз, когда какой-либо переключатель изменяется. Вместо этого вы должны сохранить конфигурацию состояния коммутатора (я предполагаю, что у вас уже есть это где-то, чтобы вы могли установить начальное состояние коммутаторов).
Теперь, когда каждый переключатель изменяется, обновите конфигурацию. Когда кнопка готово нажата, отправьте конфигурацию обратно на другой контроллер вида (или сохраните в общем хранилище / расположении).
В другом контроллере вида проверьте если бы что-то изменилось. Если да, сделайте новый запрос. Но...
Сделайте только 1 запрос. Задайте класс запроса как есть, но добавьте имена стран, которые будут включены в этот запрос:
Теперь все гораздо эффективнее и проще в обращении (один запрос и один ответ).// create array of the country names to include NSArray *countries = ...; [query whereKey:@"DescriptTitle" containedIn:countries];
Config:
У вас есть набор стран, и вы хотите иметь возможность включить / отключить их. Простая конфигурация для этого состоит в том, чтобы иметь словарь, где ключи - это названия стран, а значения-экземпляры
NSNumber, содержащие соответствующее значение СтатусаBOOL.При настройке коммутаторов можно использовать значения для задания состояния. И тогда вы можете изменить состояние, когда переключатели переключаются.
Когда это будет сделано, я буду использовать отношение делегата для передачи измененной конфигурации обратно в исходный контроллер представления (ваш контроллер представления таблицы). (Примечание: обычно делегат отклоняет контроллер представления фильтра тоже...).
Чтобы получить список стран для вашего запроса, посмотрите на использование
keysOfEntriesPassingTest:.
Настройка:
NSArray *keys = @[ @"Africa", @"Europe", @"South America", @"North America", @"Asia", @"Australia" ]; NSArray *defaultValues = @[ @YES, @YES, @YES, @YES, @YES, @YES ]; NSMutableDictionary *config = [NSMutableDictionary dictionaryWithObjects:defaultValues forKeys:keys]; self.keys = keys; self.config = config;Поиск (
filterметод):NSSet *filter = [Dictionary keysOfEntriesPassingTest: ^BOOL (id key, NSNumber *value, BOOL *stop) { return [value boolValue]; }]; PFQuery *query = [PFQuery queryWithClassName:@"Countries"]; [query whereKey:@"DescriptTitle" containedIn:[filter allObjects]]; // execute the query...Смена переключателя:
-- предположим, что коммутаторы имеют тег, который является индексом в массиве
keys- (IBAction)switchChanged:(UISwitch *)sender { [self.config setObject:@([sender isOn]) forKey:[self.keys objectAtIndex:sender.tag]]; }Нажата кнопка готово:
[self filter];
Comments