#ios #objective-c #uitableview #uilabel
#iOS #objective-c #uitableview #uilabel
Вопрос:
Я борюсь с проблемой, с которой столкнулся при попытке создать пользовательскую UITableViewCell.
Я подкласс UITableViewCell в SGTableViewCell и добавил его в ячейку прототипа в раскадровке.
Как вы можете видеть, метка подключена
и идентификатор ячейки установлен правильно
Затем я связал метку с SGTableViewCell.h следующим образом
@property (strong, nonatomic) IBOutlet UILabel *nameLabel;
и в файле .m у меня есть этот код
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
[self addGestureRecognizer:recognizer];
self.nameLabel = [[UILabel alloc] init];
_checkView = [[UIView alloc] initWithFrame:CGRectNull];
_checkView.backgroundColor = kGreen;
_checkView.alpha = 0.0;
[self addSubview:_checkView];
self.nameLabel.text = @"Hello";
}
return self;
}
Но когда я использую эту ячейку в своем tableview, используя этот код
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Episode *episode = [self.selectedSeason.episodeList objectAtIndex:indexPath.row];
SGTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Episode"];
UIView *selectionColor = [[UIView alloc] init];
selectionColor.backgroundColor = kSelectionGrey;
cell.selectedBackgroundView = selectionColor;
cell.backgroundColor = kBackgroundGrey;
cell.nameLabel.text = episode.name;
NSLog(@"%@", cell.nameLabel.text);
cell.nameLabel.textColor = [UIColor redColor];
return cell;
}
Я вообще не получаю текста.
Я попытался записать текст из каждой метки в каждой ячейке, и это дает мне правильный текст. Я попытался программно установить другой индикатор раскрытия для пользовательской ячейки, и он изменился, поэтому все выделено и работает, но метка не отображается. Я, честно говоря, понятия не имею, в чем проблема. Я что-то пропустил? Спасибо
ЧАСТИЧНО РЕШЕНА:
Хорошо, я попытался сделать то же самое в пустом проекте, и все работало безупречно, поэтому я снова проверил свой проект и нашел эту строку
[self.tableView registerClass:[SGTableViewCell class] forCellReuseIdentifier:@"Episode"];
Видя, что это не было необходимо для пустого проекта, я прокомментировал эту строку, и все начало работать.
Единственная проблема, с которой я сталкиваюсь сейчас, заключается в том, что если я не использую эту строку, я не могу использовать пользовательскую ячейку, как было задумано. На самом деле мою пользовательскую ячейку можно прокручивать с помощью средства распознавания жестов панорамирования, но без регистрации моего пользовательского класса в tableview кажется, что прокрутка не работает.
Извините за беспокойство, похоже, я снова перепутал :/
Комментарии:
1. Вы не вызываете эту строку в
cell = [[SGTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
вcellForRowAtIndexPath
.2. Она вызывается автоматически, когда вы удаляете ячейку из очереди 😉 Я ввел NSLog в метод initWithStyle, и он вызывается один раз для каждой ячейки при появлении tableview.
3. Можете ли вы загрузить свой проект куда-нибудь и дать нам взглянуть на него?
4. Если ячейка создана в раскадровке, вам не следует регистрировать класс. Отсутствие этой строки не является проблемой, поскольку swipe не работает. Когда вы регистрируете класс, это означает, что представление таблицы получит представление ячейки из определения класса, поэтому, если пользовательский интерфейс для ячейки создан в раскадровке, вы не увидите ни одного из ваших вложенных представлений. Проблема с вашим свайпом в другом месте.
5. Вы можете сделать это в раскадровке или в коде, либо должно сработать. Если вы добавляете это в коде, вы должны сделать это в методе initWithCoder: ячейки. Вы можете поместить распознаватель жестов в ячейку, чтобы добавить его в раскадровку, и либо подключить его к методу в классе cell, либо добавить метод в контроллер и добавить этот метод в распознаватель в cellForRowAtIndexPath .
Ответ №1:
Вам не следует alloc init
использовать ярлык, который вы создали в раскадровке, он уже выделен автоматически. При этом self.nameLabel = [[UILabel alloc] init];
вы сбрасываете self.nameLabel
свойство, чтобы оно указывало на новую пустую ячейку памяти, а не на ярлык, созданный в раскадровке, следовательно, вы можете изменить его text
свойство и увидеть результат в NSLog, но не в раскадровке, потому что оно не ссылается на этот ярлык в раскадровке.
Попробуйте удалить всю инициализацию из initWithStyle
метода (чтобы убедиться, что ничто не покрывает его, например, созданное вами вложенное представление), и все, что связано с меткой в cellForRowAtIndexPath
методе (по той же причине), и попробуйте простое назначение, подобное self.nameLabel.text = @"Test text"
в cellForRowAtIndexPath
методе, оно должно сработать. Затем добавьте все остальные ваши инициализации.
И да, не забудьте ввести идентификатор повторного использования вашей ячейки «Эпизод» в раскадровке.
Комментарии:
1. Я тоже так думал. Я видел, как другие люди говорили, что я должен выделить, что я и сделал. В любом случае, я удалил ее и удалил вложенные просмотры, и она все еще не работает, и когда я пытаюсь получить доступ к тексту после его установки в cellForRowAtIndexPath, все, что я получаю, это (null).
2. Вы уверены, что подключили свой IBOutlet из раскадровки к
SGTableViewCell.h
с помощью ctrl drag? Отображается ли соединение в инспекторе соединений при выборе ярлыка в раскадровке? Возможно, попробуйте удалить ее и снова подключиться.3. Обновлен основной вопрос с некоторым экраном. Соединение отображается правильно, и идентификатор ячейки установлен.
4. ОК. Если вы вообще не настраиваете ярлык в коде, отображается ли текст «Пользовательской метки», который вы настроили в раскадровке? В этом случае при регистрации
text
свойства также должна регистрироваться «Пользовательская метка».5. Я не вижу этого ни в симуляторе, ни в nslog. Я все еще получаю null при регистрации cell.nameLabel.text
Ответ №2:
Убедитесь, что вы:
-
Связали делегат и источник данных с представлением, в котором размещен tablview.
-
Пусть это представление реализует
UITableViewController
иUITableViewDelegate
(я почти уверен, что это оба из них). -
Реализуйте необходимые методы, которые вы, похоже, сделали. Вам нужны
row size, section size, and the add cell
методы -
После обновления массива, связанного с вашим tableview, вызовите [
tableView reloadData
]
Взгляните на эту ссылку:Руководство по созданию простого приложения для просмотра таблиц
Комментарии:
1. Спасибо за ответ. Я этого не говорил, но раньше я использовал обычную ячейку, и все работало нормально, так что проблема не в tableview. Проблема в метке, которую я поместил в пользовательскую ячейку
2. Почему вы используете пользовательскую метку в отличие от областей
label
иdescription
, предоставленных в исходной ячейке?3. Потому что мне нужно иметь больше, чем просто две метки в ячейке. Это только первый. Как только я узнаю, как заставить это работать, я добавлю другие 😉
4. Я знаю, что это действительно поздно, но на самом деле я только что добавил несколько пользовательских вложенных представлений в свои ячейки, и это, похоже, сработало. Мне пришлось сделать это программно, вы пробовали это вместо того, чтобы выкладывать вручную? Я следовал документации Apple.