2015-11-03 3 views
0

Я добавил панель поиска для просмотра коллекции с помощью программно. Но когда я ввожу имена для поиска, ничего не показывает. У меня есть также раздел, и каждый раздел содержит некоторые данные.не удалось выполнить поиск данных?

Вот мой код:

@interface ViewController() 
{ 
    NSMutableArray *arrayPDFName; 
    NSMutableArray *titleArray; 


} 


@property (nonatomic,strong) NSArray  *dataSourceForSearchResult; 
@property (nonatomic)  BOOL   searchBarActive; 
@property (nonatomic)  float   searchBarBoundsY; 

@property (nonatomic,strong) UISearchBar  *searchBar; 
@property (nonatomic,strong) UIRefreshControl *refreshControl; 

@end 


@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.dataSourceForSearchResult = [NSArray new]; 
    titleArray = [NSMutableArray array]; 
    [self getdata]; 


    self.mycollectionView.dataSource = self; 
    self.mycollectionView.delegate = self; 
    [self.mycollectionView reloadData]; 


} 

-(NSString*)sha256HashFor:(NSString*)input 
{ 
    const char* str = [input UTF8String]; 
    unsigned char result[CC_SHA256_DIGEST_LENGTH]; 
    CC_SHA256(str, strlen(str), result); 

    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; 
    for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) 
    { 
     [ret appendFormat:@"%02x",result[i]]; 
    } 
    return ret; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 

} 


-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [self prepareUI]; 
} 


-(void)getdata { 

    NSString *userName = @“[email protected]"; 
    NSString *password = @“password”; 
    NSData *plainData = [password dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *base64String = [plainData base64EncodedStringWithOptions:0]; 
    base64String=[self sha256HashFor: base64String]; 

    NSString *urlString = @"https://api.exampleport/user/orderid/files"; 

    NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:urlString]]; 
    [request setHTTPMethod:@"GET"]; 


    // basic authendication 
    NSString *authStr = [NSString stringWithFormat:@"%@:%@", userName, base64String]; 
    NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding]; 
    //header-field 
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64Encoding]]; 
    [request setValue:authValue forHTTPHeaderField:@"Authorization"]; 

    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 

    NSString *str = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 


    NSError * error; 

    self->arrayPDFName = [[NSMutableArray alloc]init]; 
    NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:returnData options:NSJSONReadingMutableContainers error:nil]; 




    NSDictionary *dictOriginal = jsonResults[@“dark”]; 
    [titleArray addObject:[NSString stringWithFormat:@"dark(%@)”, dictOriginal[@"count"]]]; 


    NSDictionary *dictOriginal2 = jsonResults[@"orange”]; 
    [titleArray addObject:[NSString stringWithFormat:@"orange(%@)”, dictOriginal2[@"count"]]]; 



    NSDictionary *dictOriginal3 = jsonResults[@"pencill”]; 
    [titleArray addObject:[NSString stringWithFormat:@"pencill(%@)”, dictOriginal3[@"count"]]]; 


    NSDictionary *dictOriginal4 = jsonResults[@"smart”]; 
    [titleArray addObject:[NSString stringWithFormat:@"smart(%@)”, dictOriginal4[@"count"]]]; 


    NSArray *arrayFiles = [NSArray arrayWithObjects: dictOriginal, dictOriginal2, dictOriginal3, dictOriginal4, nil]; 


    NSLog(@"str: %@", titleArray); 

     for (NSDictionary *dict in arrayFiles) { 
     NSMutableArray *arr = [NSMutableArray array]; 

     NSArray *a = dict[@"files"]; 
     for(int i=0; i < a.count; i ++) { 


      NSString *strName = [NSString stringWithFormat:@"%@",[[dict[@"files"] objectAtIndex:i] valueForKey:@"name"]]; 
      // NSLog(@"str: %@", strName); 
      [arr addObject:strName]; 
     } 
     [arrayPDFName addObject:arr]; 
    } 




    //Get plist path 
    NSString *errorDesc; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory1 = [paths objectAtIndex:0]; 
    NSString *plistPath = [documentsDirectory1 stringByAppendingPathComponent:@"SampleData.plist"]; 
    //NSLog(@"plistPath : %@",plistPath); 

    //Save data from json to plist 
    NSString *error1; 
    returnData = [NSPropertyListSerialization dataFromPropertyList:jsonResults 
                 format:NSPropertyListXMLFormat_v1_0 
              errorDescription:&error]; 
    if(returnData) { 
     if ([returnData writeToFile:plistPath atomically:YES]) { 
      NSLog(@"Data successfully saved."); 
     }else { 
      NSLog(@"Did not managed to save NSData."); 
     } 
    } 
    else { 
     NSLog(@"%@",errorDesc); 
    } 

    // NSArray *stringsArray = [NSArray arrayWithContentsOfFile:plistPath]; 

    NSDictionary *stringsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
    // NSLog(@"str: %@", stringsDictionary); 
} 
//delegate method for header 



-(UICollectionReusableView*) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { 


    HeaderView * header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"myHeader" forIndexPath:indexPath]; 


    header.myHeaderLabel.text = titleArray[indexPath.section]; 

    return header; 




} 



#pragma mark - UICollectionView Datasource 

-(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 



    return titleArray.count; 
} 



-(NSInteger) collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 


    if (self.searchBarActive) { 
     return self.dataSourceForSearchResult.count; 
    } 

    NSArray *a = arrayPDFName[section]; 
    if (a.count == 0) 

    { 


     return 1; 


    } 
     else 


     {    
     return a.count; 
      } 


    } 
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { 
    return CGSizeMake(0, 80); 
} 



- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath: (NSIndexPath *)indexPath { 
    VenueCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"mycell" forIndexPath:indexPath]; 
    cell.backgroundColor = [UIColor whiteColor]; 
    cell.imgV.image = [UIImage imageNamed:@"doc1.png"]; 

    if (self.searchBarActive) { 
     cell.myLabel.text = _dataSourceForSearchResult[indexPath.section][indexPath.row]; 
    }else{ 
     NSArray *a = arrayPDFName[indexPath.section]; 
     if (a.count == 0) { 

      cell.myLabel.text = @"NO DATA"; 

     return cell; 

     } 


     cell.myLabel.text = a[indexPath.row]; 
    } 


    return cell; 
} 

//////////////////////////for search bar ////////// 

#pragma mark - actions 
-(void)refreashControlAction{ 
    [self cancelSearching]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     // stop refreshing after 2 seconds 
     [self.mycollectionView reloadData]; 
     [self.refreshControl endRefreshing]; 
    }); 
} 



#pragma mark - search 
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{ 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self contains[c] %@", searchText]; 
    self.dataSourceForSearchResult = [self->arrayPDFName filteredArrayUsingPredicate:resultPredicate]; 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    // user did type something, check our datasource for text that looks the same 
    if (searchText.length>0) { 
     // search and reload data source 
     self.searchBarActive = YES; 
     [self filterContentForSearchText:searchText 
            scope:[[self.searchDisplayController.searchBar scopeButtonTitles] 
              objectAtIndex:[self.searchDisplayController.searchBar 
                 selectedScopeButtonIndex]]]; 
     [self.mycollectionView reloadData]; 
    }else{ 
     // if text lenght == 0 
     // we will consider the searchbar is not active 
     self.searchBarActive = NO; 
    } 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ 
    [self cancelSearching]; 
    [self.mycollectionView reloadData]; 
} 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{ 
    self.searchBarActive = YES; 
    [self.view endEditing:YES]; 
} 
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ 
    // we used here to set self.searchBarActive = YES 
    // but we'll not do that any more... it made problems 
    // it's better to set self.searchBarActive = YES when user typed something 
    [self.searchBar setShowsCancelButton:YES animated:YES]; 
} 
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ 
    // this method is being called when search btn in the keyboard tapped 
    // we set searchBarActive = NO 
    // but no need to reloadCollectionView 
    self.searchBarActive = NO; 
    [self.searchBar setShowsCancelButton:NO animated:YES]; 
} 
-(void)cancelSearching{ 
    self.searchBarActive = NO; 
    [self.searchBar resignFirstResponder]; 
    self.searchBar.text = @""; 
} 
#pragma mark - prepareVC 
-(void)prepareUI{ 
    [self addSearchBar]; 
    [self addRefreshControl]; 
} 
-(void)addSearchBar{ 
    if (!self.searchBar) { 
     self.searchBarBoundsY = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height; 
     self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,self.searchBarBoundsY, [UIScreen mainScreen].bounds.size.width, 50)]; 
     self.searchBar.searchBarStyle  = UISearchBarStyleMinimal; 
     self.searchBar.tintColor   = [UIColor whiteColor]; 
     self.searchBar.barTintColor   = [UIColor whiteColor]; 
     self.searchBar.delegate    = self; 
     self.searchBar.placeholder   = @"Search here"; 

     [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor whiteColor]]; 

     // add KVO observer.. so we will be informed when user scroll colllectionView 
     [self addObservers]; 
    } 

    if (![self.searchBar isDescendantOfView:self.view]) { 
     [self.view addSubview:self.searchBar]; 
    } 
} 

-(void)addRefreshControl{ 
    if (!self.refreshControl) { 
     self.refreshControl     = [UIRefreshControl new]; 
     self.refreshControl.tintColor  = [UIColor whiteColor]; 
     [self.refreshControl addTarget:self 
           action:@selector(refreashControlAction) 
         forControlEvents:UIControlEventValueChanged]; 
    } 
    if (![self.refreshControl isDescendantOfView:self.mycollectionView]) { 
     [self.mycollectionView addSubview:self.refreshControl]; 
    } 
} 
-(void)startRefreshControl{ 
    if (!self.refreshControl.refreshing) { 
     [self.refreshControl beginRefreshing]; 
    } 
} 

Где я делаю ошибку, и то, что мне нужно изменить, чтобы work.Thanks заранее!

+0

Проверили ли вы, что 'self.dataSourceForSearchResult' когда-либо заселены? – Avi

+0

первый мой код работал хорошо. Я также проверил. и я изменил свой основной массив «arrayPDFName» с некоторыми измененными с помощью section.so после этого, когда я не смог найти найденные элементы. – user5513630

+0

Почему вы используете 'self->'? – trojanfoe

ответ

3

Кажется, у вашего arrayPDFName есть объект массива, и каждый объект массива имеет строковый объект. Существует два способа фильтрации вашего массива.

Way - 1

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

NSArray *a1 = @[@"a1", @"a2", @"a3"]; 
NSArray *a2 = @[@"a1", @"a2", @"a3"]; 
NSArray *a3 = @[@"a1", @"a2", @"a3"]; 
NSArray *a4 = @[@"a2", @"a3"]; 

NSArray *allA = @[a1, a2, a3, a4]; 

NSPredicate *pre = [NSPredicate predicateWithFormat:@"SUBQUERY(SELF, $a, $a == %@)[email protected] > 0", @"a1"]; 
NSArray *a = [allA filteredArrayUsingPredicate:pre]; 

Way - 2

Если вы хотите, чтобы получить строку поиска в одиночку от каждого объекта массива затем следуют ниже,

NSMutableArray *fa = [[NSMutableArray alloc] init]; 
for (NSArray *a in allA) { 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"self CONTAINS[c] %@", @"a3"]; 
    [fa addObjectsFromArray:[a filteredArrayUsingPredicate:p]]; 
} 

Примечание: Над кодом сделано с таким же Пример данных. Замените его так, как хотите.

Согласно кода замените код ниже

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope { 
    NSMutableArray *fa = [[NSMutableArray alloc] init]; 
    for (NSArray *a in arrayPDFName) { 
     NSPredicate *p = [NSPredicate predicateWithFormat:@"self CONTAINS[c] %@", searchText]; 
     [fa addObjectsFromArray:[a filteredArrayUsingPredicate:p]]; 
    } 
    self.dataSourceForSearchResult = [NSArray arrayWithArray:fa]; 
} 

-(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
    if(self.searchBarActive) 
    return 1; 
    return titleArray.count; 
} 

В cellForItemAtIndexPath

cell.myLabel.text = _dataSourceForSearchResult[indexPath.row]; 
+0

на вашем 1-м пути вы сказали @ "a1" - это правильно или @ "allA" – user5513630

+0

1-й путь --------- '- (void) filterContentForSearchText: (NSString *) searchText scope: (NSString *) scope { NSPredicate * resultPredicate = [NSPredicate predicateWithFormat: @ "SUBQUERY (SELF, $ a, $ a ==% @). @ count> 0", searchText]; self.dataSourceForSearchResult = [self-> arrayPDFName filterArrayUsingPredicate: resultPredicate]; } '--- din't получить данные поиска – user5513630

+0

2nd way--' - (недействительными) filterContentForSearchText: (NSString *) SearchText объем: (NSString *) Объем { NSMutableArray * фа = [[NSMutableArray Alloc] в этом]; для (NSArray * a in arrayPDFName) { NSPredicate * p = [NSPredicate predicateWithFormat: @ "self CONTAINS [c]% @", @ "arrayPDFName"]; [fa addObjectsFromArray: [a filterArrayUsingPredicate: p]]; } } 'Не удалось получить искомые данные – user5513630

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