dequeueReusableCellWithIdentifier возвращает ноль
Я использую прототип раскадровки UITableViewCell и получаю nil, когда dequeueReusableCellWithIdentifier вызывается в cellForRowAtIndexPath. Я трижды проверил, что идентификатор Xcode для прототипа tableviewcell - "PersonCell", удалил прототипную ячейку и добавил ее снова, закомментировал наследование UISearchDisplyDelegate и UISearchBarDelegate для UITableViewController и все равно получил ноль. Я в тупике. Кто - нибудь сталкивался с этим?
#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;
}
3 ответа:
Как Мэдди заявила в комментариях, вы должны создать ячейку самостоятельно, если она равна нулю, альтернативно в вашем
viewDidLoad
или, где это уместно, вы можете вызвать один из этих методов, чтобы заставить tableview создать ячейки для васЦель-c
[self.tableView registerClass:<#(__unsafe_unretained Class)#> forCellReuseIdentifier:<#(NSString *)#>] [self.tableView registerNib:<#(UINib *)#> forCellReuseIdentifier:<#(NSString *)#>]
Swift
tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "CellID1") tableView.register(UINib(nibName: "yourNibName", bundle: nil), forCellReuseIdentifier: "CellID2")