So as of right now I am trying to implement a UISearchBarController and have been successful in filtering and getting it to do the searching right, however when I search whats displayed in the UITableviewCells is incorrect. The app is just a test app and all I want is be able to search through a bunch of different cells. Here's my code and an image as to how the search looks now:
Here's my .h:
#import <UIKit/UIKit.h>
@interface ExerciseViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>
@end
And my .m:
#import "ExerciseViewController.h"
#import "DetailViewController.h"
#import "Exercises.h"
@interface ExerciseViewController ()
@end
@implementation ExerciseViewController {
NSArray *tableData;
NSArray *searchResults;
}
@synthesize tableView = _tableView;
- (void)viewDidLoad
{
[super viewDidLoad];
//This is my data, what I want to display is the exercise name.
Exercises *exercise1 = [Exercises new];
exercise1.name = @"Barbell Rollouts";
exercise1.materials = @"30 min";
exercise1.imageFile = @"BarbellRollouts.jpg";
exercise1.sets = @"2";
exercise1.reps = @"10";
exercise1.instructions = @"Hello";
exercise1.status = @"Dynamic";
Exercises *exercise2 = [Exercises new];
exercise2.name = @"Barbell Trunk Rotation";
exercise2.materials = @"30 min";
exercise2.imageFile = @"BarbellTrunkRotation.jpg";
exercise2.sets = @"2";
exercise2.reps = @"10";
exercise2.instructions = @"";
exercise2.status = @"Dynamic";
Exercises *exercise3 = [Exercises new];
exercise3.name = @"Bent Knee Leg Raises";
exercise3.materials = @"30 min";
exercise3.imageFile = @"BentKneeLegRaises.jpg";
exercise3.sets = @"2";
exercise3.reps = @"10";
exercise3.instructions = @"";
exercise3.status = @"Dynamic";
Exercises *exercise4 = [Exercises new];
exercise4.name = @"Bicycle Manouver";
exercise4.materials = @"30 min";
exercise4.imageFile = @"BicycleManouver.jpg";
exercise4.sets = @"2";
exercise4.reps = @"10";
exercise4.instructions = @"";
exercise4.status = @"Dynamic";
Exercises *exercise5 = [Exercises new];
exercise5.name = @"Boat Pose";
exercise5.materials = @"30 min";
exercise5.imageFile = @"BoatPose.jpg";
exercise5.sets = @"2";
exercise5.reps = @"10";
exercise5.instructions = @"";
exercise5.status = @"Static";
Exercises *exercise6 = [Exercises new];
exercise6.name = @"Bosu Boat Pose";
exercise6.materials = @"30 min";
exercise6.imageFile = @"BosuBoatPose.jpg";
exercise6.sets = @"2";
exercise6.reps = @"10";
exercise6.instructions = @"";
exercise6.status = @"Static";
//now putting the array together with all the data.
tableData = [NSArray arrayWithObjects:exercise1,exercise2,exercise3,exercise4,exercise5,exercise6,nil];
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//One Section for these exercises.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
return [searchResults count];
} else {
return [tableData count];
}
}
//I think the problem is beyond here.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *simpleTableIdentifier = @"ExerciseCell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
if (tableView == self.searchDisplayController.searchResultsTableView) {
//this is where i give the name but it's not working.
cell.textLabel.text = [NSString stringWithFormat:@"%@",[searchResults objectAtIndex:indexPath.row]];
} else {
Exercises *exercise = [tableData objectAtIndex:indexPath.row];
cell.textLabel.text = exercise.name;
cell.imageView.image = [UIImage imageNamed:exercise.imageFile];
cell.detailTextLabel.text = [NSString stringWithFormat:@"Type: %@",exercise.status];
}
cell.detailTextLabel.font = [UIFont fontWithName:@"Avenir-Black" size:16];
cell.textLabel.font = [UIFont fontWithName:@"Avenir-Black" size:20];
cell.textLabel.textColor = [UIColor peterRiverColor];
cell.detailTextLabel.textColor = [UIColor peterRiverColor];
return cell;
}
//here i start to filter.
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText];
searchResults = [tableData filteredArrayUsingPredicate:resultPredicate];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
How the search looks now:
(obviously I want to display to show the name of the exercise, not whatever its doing now)
Please help, it would be greatly appreciated. Thanks
searchResults
is an array of Exercises
objects, therefore
cell.textLabel.text = [NSString stringWithFormat:@"%@",[searchResults objectAtIndex:indexPath.row]];
just shows the (default) description of such an object. What you probably want is (as in the else-case):
Exercises *exercise = [searchResults objectAtIndex:indexPath.row];
cell.textLabel.text = exercise.name;