#iphone #uitableview #interface-builder
#iPhone #uitableview #конструктор интерфейса
Вопрос:
видел похожие вопросы, но не смог найти окончательного ответа.
Освоив обычные таблицы большинства типов, я провожу несколько концептуальных экспериментов с пользовательскими ячейками таблицы, чтобы ознакомиться с тем, как это работает. Я хочу иметь пользовательский подкласс UITableViewCell, который загружает кончик в contentView. Возможно, я захочу реализовать разные стили редактирования на более позднем этапе, но хочу повторно использовать пользовательский вид в разных частях моего приложения, однако у меня возникли проблемы с получением сообщения didSelectRowAtIndexPath в моем вызывающем UITableViewController.
Вот иерархия, которая построена на основе базового шаблона представления.
Пользовательский cellviewcontroller: стандартный класс XCode objective-c, выделенный из UITableViewCell
@interface CustomCellViewController : UITableViewCell {
IBOutlet UILabel *lbl;
}
@property (nonatomic, retain) IBOutlet UILabel *lbl;
@end
@implementation CustomCellViewController
@synthesize lbl;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// Initialization code
NSArray *a = [[NSBundle mainBundle] loadNibNamed:@"customCellView" owner:self options:nil];
UITableViewCell *tc = [a objectAtIndex:0];
NSLog(@"Cell loaded from nib");
[self.contentView addSubview:tc];
}
return self;
}
.. the other stock methods are unchanged ..
@end
Я понимаю, что метод инициализации можно было бы упростить, но это моя первая попытка.
Владельцем файла XIB является мой пользовательский класс (CustomCellViewController), у которого есть UITableViewCell и ярлык (связанный с выходом ‘lbl’ на нем), расположенные на полпути друг к другу, что делает кликабельными многие базовые UITableViewCell.
RootViewController — это стандартный стандартный подкласс XCode UITableViewController RootViewController устанавливает переменную экземпляра «CustomTableCellController *myCustomCell»
cellForRowAtIndexPath: выглядит следующим образом:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"myCustomCell";
CustomCellViewController *cell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[CustomCellViewController alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
NSLog(@"Creating New cell for position %d", indexPath.row);
} else {
NSLog(@"Reusing cell for position %d", indexPath.row);
}
// Configure the cell.
cell.lbl.text = [NSString stringWithFormat: @"Hi There %d", indexPath.row];
return cell;
}
И в том же RootViewController.m мой didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Cell tapped at row %d", indexPath.row);
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}
В настоящее время разработан для простого вывода сообщения журнала при нажатии.
numberOfSectionsInTableView возвращает 1, numberOfRowsInSection возвращает 50
Все это компилируется и работает нормально, запускается симулятор iPhone, я вижу таблицу на дисплее, мой журнал вывода подтверждает, что создано 9 версий CustomCellViewController, и я могу видеть стек повторного использования через комментарии NSLog ().
Я просто не могу выбрать строку, не имеет значения, где я нажимаю в пользовательской ячейке, ничего не попадает в мой didSelectRowAtIndexPath: в моем RootViewController, где я этого и ожидаю.
Это из-за того, что я где-то не установил делегат, и если да, то как? Нужно ли мне делать это через службу первого реагирования? (т. Е. создайте метод в моем классе CustomCellViewController, свяжите UITableViewCell из XIB с этим методом, а затем вызовите [super didSelectRowAtIndexPath] — но как мне передать indexPath?
Я не отвечаю на сообщение от моего XIB в его владельце, а затем передаю его дальше (вот как я это делаю?)
Я прочитал все документы Apple, чтобы перейти к этому этапу, но не смог полностью расшифровать, как происходит обмен сенсорными сообщениями.
Немного запутался!
Ответ №1:
Возможно, вы забыли установить источник данных и делегировать, если объект tableview установил его как показано ниже
tbl.delegate = self;
tbl.dataSource = self;
Комментарии:
1. также напишите <UITableViewDelegate,UITableViewDataSource> в строке интерфейса, чтобы реализовать этот метод
2. Повторное делегирование и источник данных, если вы говорите о моем RootViewController, из которого инициируется UITableView, источник данных правильный, поскольку ячейки заполняются, и я знаю, что делегат установлен правильно, потому что, если я изменяю свой код cellForRowAtIndexPath на использование стандартной UITableViewCell, вызывается didSelectRowAtIndex. В какой файл вы говорите о добавлении протоколов? RootViewController или мой пользовательский cellviewcontroller? Опять же, даже без них неявно, те, которые работают с rootView, если я не использую свою пользовательскую ячейку, ячейка не принимает событие касания от имени таблицы.
3. В вашей пользовательской ячейке есть метка. задаете ли вы текст в точности, который вы устанавливаете. также попробуйте проверить после удаления метки. возможно, ваша метка создает какую-то проблему
4. Да, если я это сделаю
cell.lbl.text = @"some text";
, это попадет на метку, метка не полностью закрывает объект ячейки таблицы под ним, как будто что-то не полностью подключено для передачи щелчка вниз получателю, но я ничего не могу подключить в IB к методу в моем пользовательском классе table cell5. Кроме того, все другие примеры, похоже, загружают перо в cellForRowAtIndexPath, но также требуют файла класса, но я, похоже, не могу понять, как тогда ПЕРО узнает о функциях в классе (argghhhh!), это как-то связано с тем, что мое ПЕРО эффективно заменяет ячейку и, возможно, не имеет
contentView
свойства на этом этапе. У кого-нибудь есть URL-адрес пошагового руководства, в котором используется пользовательский класс, который загружает перо, а не TableViewDataSource, загружающий перо напрямую, другими словамиcell = [[CustomCell alloc] initWithStyle:reuseIdentifier];