2015-10-21 2 views
0

EDIT: После того, как я пробрался еще дальше, я понял, что использование XLData требует, чтобы я имел данные где-то в сети, потому что поиск запрашивал результаты из URL вместо из моего набора данных.Как использовать поиск по XLData с указанным списком данных

Итак, теперь мой вопрос: как использовать функцию поиска XLData с конкретным списком данных и запросить набор данных вместо данных в Интернете?

Просто запоздалая мысль. Ввод «a» действительно возвращал некоторые результаты при применении в качестве кода ниже. Как это произошло?


Я использую XLData, чтобы загрузить список клиентов для поиска и выбрать из, но результаты поиска, введенные в поле поиска, кажется, не влияют на результаты поиска на всех.

Например, поиск «пищи» (когда у первого элемента списка явно есть «еда» на свое имя), не фильтрует это имя клиента в результатах поиска. И поиск номеров - имя клиента, начинающегося с цифры, не дает никаких результатов.

Как поймать результаты поиска на основе условий поиска, чтобы отладить его и посмотреть, что происходит?

Другое дело, что при загрузке результатов поиска список усекается до 9 элементов, даже если их насчитывается более 1000 клиентов.

enter image description here

Это класс для выбора клиента (некоторое имя пользователя и код изображений по-прежнему существует для позиций, потому что я использовал пример XLData как есть, но я не отображать изображение):

#import "CustomersTableViewController.h" 
#import "AppDelegate.h" 
#import "HTTPSessionManager.h" 
#import <AFNetworking/UIImageView+AFNetworking.h> 

@interface UserCell : UITableViewCell 

@property (nonatomic) UIImageView * userImage; 
@property (nonatomic) UILabel * userName; 

@end 

@implementation UserCell 

@synthesize userImage = _userImage; 
@synthesize userName = _userName; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

     [self.contentView addSubview:self.userImage]; 
     [self.contentView addSubview:self.userName]; 

     [self.contentView addConstraints:[self layoutConstraints]]; 
    } 
    return self; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [super setSelected:selected animated:animated]; 
} 

#pragma mark - Views 

-(UIImageView *)userImage 
{ 
    if (_userImage) return _userImage; 
    _userImage = [UIImageView new]; 
    [_userImage setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    _userImage.layer.masksToBounds = YES; 
    _userImage.layer.cornerRadius = 10.0f; 
    return _userImage; 
} 

-(UILabel *)userName 
{ 
    if (_userName) return _userName; 
    _userName = [UILabel new]; 
    [_userName setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    _userName.font = [UIFont fontWithName:@"HelveticaNeue" size:15.f]; 

    return _userName; 
} 

#pragma mark - Layout Constraints 

-(NSArray *)layoutConstraints{ 

    NSMutableArray * result = [NSMutableArray array]; 

    NSDictionary * views = @{ @"image": self.userImage, 
           @"name": self.userName}; 

    NSDictionary *metrics = @{@"imgSize":@0.0, 
           @"margin" :@10.0}; 

    [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(margin)-[image(imgSize)]-[name]" 
                     options:NSLayoutFormatAlignAllTop 
                     metrics:metrics 
                      views:views]]; 

    [result addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(margin)-[image(imgSize)]" 
                     options:0 
                     metrics:metrics 
                      views:views]]; 

    return result; 
} 

@end 


@interface CustomersTableViewController() <UISearchControllerDelegate> 

@property (nonatomic, readonly) CustomersTableViewController * searchResultController; 
@property (nonatomic, readonly) UISearchController * searchController; 

@end 

@implementation CustomersTableViewController 
@synthesize rowDescriptor = _rowDescriptor; 
@synthesize popoverController = __popoverController; 
@synthesize searchController = _searchController; 
@synthesize searchResultController = _searchResultController; 

static NSString *const kCellIdentifier = @"CellIdentifier"; 
NSMutableArray *customers; 

- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     [self initialize]; 
    } 
    return self; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if(self) 
    { 
     [self initialize]; 
    } 

    return self; 
} 

- (void)initialize 
{ 

    customers = [[NSMutableArray alloc] init]; 
    customers = [AppDelegate getCustomers]; 

    for (int i=0; i<[customers count]; i++){ 
     [self.dataStore addDataItem:[customers objectAtIndex:i]]; 
    } 

    self.dataLoader = [[XLDataLoader alloc] initWithURLString:@"/mobile/users.json" offsetParamName:@"offset" limitParamName:@"limit" searchStringParamName:@"filter"]; 
    self.dataLoader.delegate = self; 
    self.dataLoader.storeDelegate = self; 
    self.dataLoader.limit = [customers count]; 
    self.dataLoader.collectionKeyPath = @""; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.tableView registerClass:[UserCell class] forCellReuseIdentifier:kCellIdentifier]; 
    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 

    if (!self.isSearchResultsController){ 
     self.tableView.tableHeaderView = self.searchController.searchBar; 
    } 
    else{ 
     [self.tableView setContentInset:UIEdgeInsetsMake(64, 0, 0, 0)]; 
     [self.tableView setScrollIndicatorInsets:self.tableView.contentInset]; 
    } 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.searchController.searchBar sizeToFit]; 
} 

#pragma mark - UITableViewDataSource 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UserCell *cell = (UserCell *) [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath];; 

    cell.userName.text = [customers objectAtIndex:indexPath.row]; 

    cell.accessoryType = [self.rowDescriptor.value isEqual:[customers objectAtIndex:indexPath.row]] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; 

    return cell; 
} 

#pragma mark - UITableViewDelegate 

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 44.0f; 
} 

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    self.rowDescriptor.value = [customers objectAtIndex:indexPath.row]; 

    if (self.popoverController){ 
     [self.popoverController dismissPopoverAnimated:YES]; 
     [self.popoverController.delegate popoverControllerDidDismissPopover:self.popoverController]; 
    } 
    else if ([self.parentViewController isKindOfClass:[UINavigationController class]]){ 
     [self.navigationController popViewControllerAnimated:YES]; 
    } 
} 

#pragma mark - XLDataLoaderDelegate 

-(AFHTTPSessionManager *)sessionManagerForDataLoader:(XLDataLoader *)dataLoader 
{ 
    return [HTTPSessionManager sharedClient]; 
} 

#pragma mark - UISearchController 

-(UISearchController *)searchController 
{ 
    if (_searchController) return _searchController; 

    self.definesPresentationContext = YES; 
    _searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchResultController]; 
    _searchController.delegate = self; 
    _searchController.searchResultsUpdater = self.searchResultController; 
    _searchController.searchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
    [_searchController.searchBar sizeToFit]; 
    return _searchController; 
} 


-(CustomersTableViewController *)searchResultController 
{ 
    if (_searchResultController) return _searchResultController; 
    _searchResultController = [self.storyboard instantiateViewControllerWithIdentifier:@"CustomersTableViewController"]; 
    _searchResultController.dataLoader.limit = 0; // no paging in search result 
    _searchResultController.isSearchResultsController = YES; 
    return _searchResultController; 
} 

@end 
+0

Я думаю, что он должен что-то сделать с self.dataStore vs self.dataLoader. Я просто не знаю, как это сделать. – marienke

ответ

0

Я закончил с использованием нормального решения Поиск бар, как описано Appcoda:

Я все еще хотел бы быть в состоянии использовать XLData, поскольку это помогает с большим количеством других вещей, и легко интегрируется с XLFo rms, которые я также использую.

Но реализация строки поиска из Appcoda оказалась достаточной для моих требований.

0

Вы портя все с этой строки кода:

self.dataLoader = [[XLDataLoader alloc] initWithURLString:@"/mobile/users.json" offsetParamName:@"offset" limitParamName:@"limit" searchStringParamName:@"filter"]; 

Это JSON файл только 9 объектов !!!

С уважением

Смежные вопросы