I am using a Storyboard's prototype UITableViewCell and getting nil when dequeueReusableCellWithIdentifier is called in cellForRowAtIndexPath. I have triple checked that the Xcode's Identifier for the prototype tableviewcell is "PersonCell", deleted the prototype cell and added it again, commented out the UISearchDisplyDelegate and UISearchBarDelegate inheritance for the UITableViewController, and still get nil. I am stumped. Has anyone run into this?
#import "PeopleGroupPickerViewController.h"
#import "DAL.h"
#import "Person.h"
@interface PeopleGroupPickerViewController ()
@end
@implementation PeopleGroupPickerViewController
{
NSArray *people;
NSArray *searchResults;
}
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem;
people = [[DAL sharedInstance] getPeople:false];
[self.tableView registerClass:[GenericDetailCell class] forCellReuseIdentifier:@"PersonCell"];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSString *lastNameSearch = searchText.lowercaseString;
NSString *firstNameSearch = @"";
if ([lastNameSearch rangeOfString:@","].length > 0)
{
NSArray *names = [lastNameSearch componentsSeparatedByString:@","];
//NSLog(@"names count",names.count);
if(names.count > 1)
{
lastNameSearch = names[0];
firstNameSearch = names[1];
//NSLog(@"first %@ last %@",firstNameSearch,lastNameSearch);
}
}
NSMutableString *predicateText = [[NSMutableString alloc] initWithFormat:@"(sLastName contains[c] '%@')",lastNameSearch];
if(![firstNameSearch isEqualToString:@""])
{
[predicateText appendFormat:@" AND (sFirstName contains[c] '%@')",firstNameSearch];
}
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:predicateText.copy];
searchResults = [people filteredArrayUsingPredicate:resultPredicate];
NSLog(@"filterContentForSearchText, searching for %@, # results: %d",predicateText, searchResults.count);
}
-(BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString scope:nil];
return YES;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if(tableView == self.searchDisplayController.searchResultsTableView)
{
return 1;
}
else
{
return 1;
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if(tableView == self.searchDisplayController.searchResultsTableView)
{
return searchResults.count;
}
else
{
return people.count;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
GenericDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PersonCell" forIndexPath:indexPath];
Person_ *thisPerson;
if(tableView == self.searchDisplayController.searchResultsTableView)
{
thisPerson = (Person_ *) searchResults[indexPath.row];
}
else
{
thisPerson = (Person_ *) people[indexPath.row];
}
Person_ *thisSpouse = [[DAL sharedInstance] getSpouse:thisPerson People:people];
cell.fieldName.text = thisPerson.sName;
cell.fieldValue.text = thisSpouse.sName;
return cell;
}
nil
fromdequeueReusableCellWithIdentifier:
is perfectly normal and expected. If it'snil
you must create the cell instance. If you registered a cell then usedequeueReusableCellWithIdentifier:forIndexPath:
. That won't returnnil
. – Goshawk