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;
}

person MarkF    schedule 05.08.2014    source источник
comment
Получение nil от dequeueReusableCellWithIdentifier: совершенно нормально и ожидаемо. Если это nil, вы должны создать экземпляр ячейки. Если вы зарегистрировали ячейку, используйте dequeueReusableCellWithIdentifier:forIndexPath:. Это не вернет nil.   -  person rmaddy    schedule 05.08.2014
comment
rmaddy, вопрос, на который вы меня направили, говорит о том, что с раскадровками и представлениями таблиц, которые имеют ячейки-прототипы, [tableView dequeueReusableCellWithIdentifier:] не должен возвращать nil. Проблема этого вопроса была связана с повторной инициализацией делегата приложения tableviewcontroller. Я использую простой ванильный UITableViewController в раскадровке, поэтому я не уверен, что это та же проблема.   -  person MarkF    schedule 05.08.2014
comment
@rmaddy ты лучший!   -  person GJain    schedule 13.11.2014


Ответы (4)


Как Мэдди заявил в комментариях, вы должны сами создать ячейку, если она равна нулю, в качестве альтернативы в вашем viewDidLoad или, где это уместно, вы можете вызвать один из этих методов, чтобы табличное представление создало ячейки для вас.

Цель-c

[self.tableView registerClass:<#(__unsafe_unretained Class)#> forCellReuseIdentifier:<#(NSString *)#>]
[self.tableView registerNib:<#(UINib *)#> forCellReuseIdentifier:<#(NSString *)#>]

Свифт

tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "CellID1")
tableView.register(UINib(nibName: "yourNibName", bundle: nil), forCellReuseIdentifier: "CellID2")
person Fonix    schedule 05.08.2014
comment
[self.tableView registerClass: [класс UITableViewCell] forCellReuseIdentifier: @PeopleCell]; обходит ошибку nil и привязывает таблицу, но привязывает неправильный класс ячеек. Стиль ячейки прототипа - Right Detail, но он связывает общий класс UITableViewCell, который я не могу связать с detailTextLabel . Я работал над этим, создав свой собственный подкласс UITableViewCell и подключив метки к его выходам. - person MarkF; 05.08.2014
comment
Еще одно замечание: мне пришлось зарегистрировать пользовательский подкласс UITableViewCell как для обычного UITableView (self.tableView), так и для результатов поиска UITableView (self.searchDisplayController.searchResultsTableView) в viewDidLoad. - person MarkF; 05.08.2014
comment
Только что закончил работать, хотя похожая ситуация.. Добавлен код, созданный TableViewController, для родительского объекта UIViewController, а затем присоединение UITableView в моем nib к UITableViewController, который я только что создал. Вот трюк, который я нашел: # 1) Создайте и добавьте UITableViewController в ваш родительский контроллер представления. 2) Затем найдите дочерний UITableView, который находится в представлении контейнера, и используйте «[childTableVC setTableView: myTableView]». 3) Затем зарегистрируйте ячейки в виде таблицы. У меня не работает при регистрации ячеек перед добавлением tableViewController. - person Dan Devine; 18.07.2017

У меня возникла эта проблема после установки «Идентификатора восстановления» в инспекторе удостоверений. Правильным местом для установки reuseIdentifier является поле «Идентификатор» в инспекторе атрибутов.

person ChrisBob    schedule 19.05.2017

Добавление к ответу @Fonix

Убедитесь, что Inherit Module From Target включен

введите здесь описание изображения

person arthankamal    schedule 16.01.2018

Это может произойти, если tableView, в котором находится ваша ячейка, не назначает ваш контроллер представления в качестве делегата и источника данных для представления таблицы.

введите здесь описание изображения

person ScottyBlades    schedule 14.10.2018