ios - 无法搜索数据?

标签 ios objective-c search uicollectionview

我已经使用编程方式为 Collection View 添加了搜索栏。但是当我输入名称进行搜索时,没有任何显示。我也有一些部分,每个部分都包含一些数据。

这是我的代码:

@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 = @“username@yahoo.com";
    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];
    }
}

我在哪里做错了,我需要改变什么才能工作。提前致谢!

最佳答案

您的 arrayPDFName 似乎有数组对象,每个数组对象都有字符串对象。有两种方法可以过滤数组。

方式 - 1

如果您想要获取具有搜索字符串的数组列表,请将 SUBQUERY 与您的谓词一起使用。如下所示。

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 == %@).@count > 0", @"a1"];
NSArray *a = [allA filteredArrayUsingPredicate:pre];

方式 - 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];

关于ios - 无法搜索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33505951/

相关文章:

ios - 如何设置在 iPhone 上以编程方式选择的第一个 TabBar

c# - 如何在字符串中搜索一个词,然后得到这个词后面的数字?

ios - 如何在非ARC模式下手动释放此静态变量

ios - 在锁定屏幕中查看并启用远程通知类型 - iOS 5

ios - 将 `RxTableViewSectionedAnimatedDataSource` 绑定(bind)到 UITableView 时生成错误

objective-c - 标签栏 Controller 和 Facebook Connect 问题 Xcode 4.3 IOS 5.1

objective-c - 两个 UIViewController 的故事

基于 SQL 索引的搜索

Python:搜索列表并给出 boolean 值

iphone - iOS 256 色 (VGA) 到 RGB