Пользовательский 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, который связан с классом.
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;
}