motionpotion
motionpotion

Reputation: 2736

How To Provide Search-As-You-Type Filtering With UICollectionView?

I have a UICollectionView added to a ViewController. The UICollectionView displays a grid of items with peoples names on each cell. I would like to add search as you type functionality that will filter the UICollectionView as the user types in their name to a searchbar or UITextField on the ViewController so that it doesn't scroll with the content in the UICollectionView.

Even though a few places I have read that UICollectionView is similar to UITableView I don't see that implementing this filter/search functionality is the same in UICollectionView as it is with UITableView and need some help with it.

Does anyone have a good example of doing this search/filter as you type functionality with UICollectionView?

Upvotes: 3

Views: 3653

Answers (1)

motionpotion
motionpotion

Reputation: 2736

I solved it by doing the following (hope it helps somebody else):

I populate my UICollectionView from CoreData into an NSArray:

self.allCVData = [context executeFetchRequest:fetchRequest error:&error];

then add my NSArray to an NSMutableArray so that I can use that for filtering on the UICollection:

self.filteredCVData =  [[NSMutableArray alloc] initWithArray:allCVData];

Added a UITextField and called it searchField.

Added a selector in viewDidLoad:

[mytextfield addTarget:self action:@selector(textDidChange:) forControlEvents:UIControlEventEditingChanged];

Added a method to accept changes in the UITextField:

-(void) textDidChange:(id)sender
{

    UITextField* searchField = (UITextField *) sender;

    if(searchField.text.length == 0)
    {
        self.isFiltered = FALSE;
        [self.filteredCVData removeAllObjects];
        [self.filteredCVData addObjectsFromArray:self.allCVData];
    }
    else
    {
        self.isFiltered = true;
        [self.filteredCVData removeAllObjects];
        self.filteredCVData = [[NSMutableArray alloc] init];

        LogInfo(@"Before Looping in allCVData Array.");
        for (OLPerson* person in allCVData)
        {
            NSRange firstnameRange = [person.firstname rangeOfString:searchField.text options:NSCaseInsensitiveSearch];
            NSRange surnameRange = [person.surname rangeOfString:searchField.text options:NSCaseInsensitiveSearch];
            if(firstnameRange.location != NSNotFound || surnameRange.location != NSNotFound)
            {
                [self.filteredCVData addObject:person];
            }
        }
    }

    [self.collectionView reloadData];

}

Upvotes: 4

Related Questions