J'utilise le prototype UITableViewCell d'un Storyboard et je n'ai aucune valeur lorsque dequeueReusableCellWithIdentifier est appelé dans cellForRowAtIndexPath. J'ai vérifié trois fois que l'identifiant du Xcode pour le prototype tableviewcell est "PersonCell", j'ai supprimé le prototype et l'a ajouté à nouveau, commenté les héritages UISearchDisplyDelegate et UISearchBarDelegate pour UITableViewController, et toujours nul. Je suis perplexe. Quelqu'un at-il couru dans cela?
#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;
}
Comme maddy l'a indiqué dans les commentaires, vous devez créer la cellule vous-même si elle est nulle, sinon dans votre viewDidLoad
ou, le cas échéant, vous pouvez appeler l'une de ces méthodes pour que la vue tableau crée les cellules pour vous
Objectif c
[self.tableView registerClass:<#(__unsafe_unretained Class)#> forCellReuseIdentifier:<#(NSString *)#>]
[self.tableView registerNib:<#(UINib *)#> forCellReuseIdentifier:<#(NSString *)#>]
Rapide
tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "CellID1")
tableView.register(UINib(nibName: "yourNibName", bundle: nil), forCellReuseIdentifier: "CellID2")
J'ai eu ce problème après avoir défini le "ID de restauration" dans l'inspecteur d'identité. L'emplacement correct pour définir reuseIdentifier est le champ "Identifier" situé dans l'inspecteur Attributs.