Загрузка подкласса UITableViewCell с использованием файла XIB

Мне не удается получить мой CustomTableViewCell, подкласс UITableViewCell для отображения в моем представлении таблицы.

Я использую xib для представления этой ячейки, но я предполагаю, что код для делегата источника данных не изменяется. Я постарался установить идентичный идентификатор повторного использования внутри ячейки представления таблицы XIB.

Я изолировал проблему от того, что метод источника данных, который возвращает ячейку таблицы, работает некорректно, вот оно:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    DataObject *foo = [self.dataArray objectAtIndex:indexPath.row];

    if (cell == nil) 
    {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    [[cell overview] setText:foo.overview];
    [[cell price] setText:foo.price];
    NSLog(@"cell initialized, description text is %@",cell.overview.text);

    return cell;
}

Не знаю, почему это не работает, но последний оператор журнала всегда печатает (нуль) в конце, и да, я убедился, что свойство overview объекта данных имеет в нем допустимую строку. То же самое для price.

Ответ 1

В файле .h вы пишете его.

IBOulet CustomTableViewCell *tableCell;

и подключиться к файловому владельцу в файле .xib CustomTableViewCell.

Вы изменяете это в (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

if (cell == nil) 
 {
     [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil];
     cell = tableCell;
 }

Я думаю, это будет полезно для вас.

Ответ 2

1) Сделайте свой собственный класс ячеек отдельно

2) XIB: изменение класса владельца файла в NSObject

3) XIB: изменение UITableViewCell в MyTableViewCell

4) Если вы хотите добавить код представления внутри таблицы как

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *CellIdentifier = @"MyCell";

    MyTableViewCell *cell = (MyTableViewCell*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        NSArray *arrayCellXib = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" 
                                                              owner:self 
                                                            options:nil];
        if (indexPath.row == 0) {
            // first table cell
            cell = [arrayCellXib objectAtIndex:0]; // *
            ...... 
         }else {

            cell = [arrayCellXib objectAtIndex:1]; // *
         }
        ...
      }
   return cell;

}

Объект с индексом 0,1... является индексом, для какого порядка вы делаете MyTableViewCell в xib, если вы хотите иметь более одной пользовательской ячейки. означает в классе MyTableViewCell u создавать неограниченную пользовательскую ячейку и использовать в соответствии с требованиями.

Как правило, просто сделайте ONE пользовательскую ячейку в XIB и выполните именно это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    int thisRow = indexPath.row;
    NSString *exampleText = [yourData objectAtIndex:thisRow];

    static NSString *CellID = @"cu5";

    FancyCell *cell =
       (FancyCell *)[tableView dequeueReusableCellWithIdentifier:CellID];
    if (cell == nil)
        {
        NSArray *cellTeam =
          [[NSBundle mainBundle] loadNibNamed:@"FancyCell"
             owner:self options:nil];
        cell = [cellTeam objectAtIndex:0];
        }

    [cell someFunction:exampleText];
    [cell.someLabel setText:exampleText];
    return cell;
    }

В надежде может помочь u:)