Фильтр 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{
}
}
];
609   1  

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

    Ничего не найдено.