Должен ли я сам создавать все элементы пользовательского интерфейса при использовании пользовательской UITableViewCell?

#ios #objective-c #uitableview

#iOS #objective-c #uitableview

Вопрос:

Я следую этому руководству по созданию пользовательской UITableViewCell, и в объекте, возвращаемом из [tableView dequeueReusableCellWithIdentifier:@"ID"] , все его UILabels и т.д. Являются nil . В этом руководстве ничего не говорится о том, как создавать их самостоятельно, и я ожидаю, что мне это не понадобится, судя по тому, как работает остальная часть iOS, но я не знаю, почему они не создаются автоматически. Например, здесь cell.lightName есть nil , хотя он подключен к метке, которая завершается в пользовательском представлении в IB.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *dataCellIdentifier = @"Data Cell";
    AnalysisHistoryTableViewCell *cell = (AnalysisHistoryTableViewCell*)[tableView dequeueReusableCellWithIdentifier:dataCellIdentifier forIndexPath:indexPath];    
    self.selectedAnalysis = self.analysisResults[indexPath.row];
    cell.lightNameLabel.text = self.selectedAnalysis.lightName;
    return cell;
}
  

Что я делаю не так, из-за чего мои UILabel s не существуют?

Комментарии:

1. Я предполагаю, что в вашем AnalysisHistoryTableViewCell вы синтезировали свойство, которое связано с UILabel в вашей ячейке.

2. Вы зарегистрировали перо в табличном представлении ( registerNib: )?

3. Вы используете Xib или раскадровку? Где вы объявляете метку? Вы синтезировали метку или нет?

4. Я не синтезировал метку. Обычно я просто ссылаюсь на это с помощью self . Я попробовал это, но это не помогло.

5. @sooper Я этого не делал. Однако это устранило проблему. Интересно, почему это не упоминается в руководстве.

Ответ №1:

Для пользовательской ячейки вам нужно сначала зарегистрировать перо:

 - (void)viewDidLoad {
    [super viewDidLoad];

    [self.tableView registerNib:[UINib nibWithNibName:@"AnalysisHistoryTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Data Cell"];
}
  

Затем в вашем cellForRowAtIndexPath методе:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    AnalysisHistoryTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Data Cell"];

    //etc

    return cell;
}