iOS: путаница с пользовательским сенсорным приемником UITableViewCell

#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 cell

5. Кроме того, все другие примеры, похоже, загружают перо в cellForRowAtIndexPath, но также требуют файла класса, но я, похоже, не могу понять, как тогда ПЕРО узнает о функциях в классе (argghhhh!), это как-то связано с тем, что мое ПЕРО эффективно заменяет ячейку и, возможно, не имеет contentView свойства на этом этапе. У кого-нибудь есть URL-адрес пошагового руководства, в котором используется пользовательский класс, который загружает перо, а не TableViewDataSource, загружающий перо напрямую, другими словами cell = [[CustomCell alloc] initWithStyle:reuseIdentifier];