Пользовательский UITableViewCell не использует .xib(наиболее вероятно из-за ошибки в методе init)

Я подклассифицировал UITableViewCell, чтобы настроить его, но я думаю, что у меня что-то не хватает, потому что: 1) он не работает и 2) Есть несколько вещей, в которые я запутался. Наряду с настройкой внешнего вида файла .xib, я также изменил backgroundView, и эта часть работает нормально. Часть, которую я наименее понимаю/меня больше всего смущает, - это метод init, поэтому я разместил это здесь. Если окажется, что это правильно, сообщите мне, чтобы я мог опубликовать больше кода, который может быть причиной.

Это метод init, который я настроил. Я немного запутался в идее "стиля", и я думаю, что просто возвращаю обычный UITableViewCell с другим backgroundView. Я имею в виду, что там ничего нет, что относится к .xib или ничего, кроме изменения .backgroundView из self:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier wait: (float) wait fadeOut: (float) fadeOut fadeIn: (float) fadeIn playFor: (float) playFor
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        CueLoadingView* lview = [[CueLoadingView alloc] initWithFrame:CGRectMake(0, 0, 320, 53)];
        self.backgroundView = lview;

        [self setWait:wait]; // in turn edits the lview through the backgrounView pointer
        [self setFadeOut:fadeOut];
        [self setFadeIn:fadeIn];
        [self setPlayFor:playFor];
    }
    return self;
}

Помимо xix и нескольких сеттеров и геттеров, это единственная реальная часть моего кода, которая связана с извлечением ячейки.

Дополнительная информация:

1) Это мой .xib, который связан с классом. enter image description here

2) Это код, который вызывает/создает UITableView (контроллер делегата/представления):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"CueTableCell";

    CueTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[CueTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier wait:5.0 fadeOut:1.0 fadeIn:1.0 playFor:10.0];
        [cell updateBarAt:15];
    }

    return cell;
}

Ответы

Ответ 1

Самый простой способ (доступный с iOS 5.0) создать пользовательскую ячейку таблицы в файле nib - использовать registerNib:forCellReuseIdentifier: в контроллере табличного представления. Большим преимуществом является то, что dequeueReusableCellWithIdentifier: затем автоматически создает ячейку из файла nib, если это необходимо. Вам больше не нужна часть if (cell == nil) ....

В viewDidLoad контроллера табличного представления вы добавляете

[self.tableView registerNib:[UINib nibWithNibName:@"CueTableCell" bundle:nil] forCellReuseIdentifier:@"CueTableCell"];

и в cellForRowAtIndexPath вы просто делаете

CueTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CueTableCell"];
// setup cell
return cell;

Ячейки, загруженные из файла nib, создаются с помощью initWithCoder, вы можете переопределить это в своем подклассе, если это необходимо. Для изменения элементов интерфейса вы должны переопределить awakeFromNib (не забудьте вызвать "супер" ).

Ответ 2

Вместо этого вы должны загрузить ячейку из .xib:

if ( cell == nil ) {
    cell = [[NSBundle mainBundle] loadNibNamed:@"CellXIBName" owner:nil options:nil][0];
}

// set the cell properties

Ответ 3

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"CueTableCell";

    CueTableCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"CueTableCell XibName" owner:self options:nil];
        // Grab a pointer to the first object (presumably the custom cell, as that all the XIB should contain).
        cell = [array objectAtIndex:0];
    }

    return cell;
}