iOS: пользовательский UITableViewCell сенсорный приемник путаница - PullRequest
1 голос
/ 27 апреля 2011

видел похожие вопросы, но не смог найти однозначного ответа.

Освоив обычные таблицы большинства типов, я провожу некоторые концептуальные эксперименты с пользовательскими ячейками таблиц, чтобы ознакомиться с тем, как это работает.Я хочу иметь пользовательский подкласс UITableViewCell, который загружает перо в contentView.Возможно, я захочу реализовать разные стили редактирования в какой-то более поздний момент, но хочу повторно использовать пользовательское представление в разных частях моего приложения, однако у меня возникла проблема с получением сообщения didSelectRowAtIndexPath в моем вызывающем UITableViewController.

Вотиерархия, которая построена из базового шаблона представления.

CustomCellViewController: стандартный класс X-кода для цели 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

Я понимаю, что метод init можно упростить, но это мойпервая попытка.

Владельцем файла XIB является мой пользовательский класс (CustomCellViewController), имеющий UITableViewCell и метку (связанную с выходом 'lbl' на нем), расположенную на полпути поперек, оставляя множество базовых UITableViewCell, доступных для нажатия.

RootViewController является стандартным стандартным подклассом XCode UITableViewController. RootViewController устанавливает переменную экземпляра "CustomTableCellController * myCustomCell"

cellForRowAtIndexPath: как указано нижеws:

- (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 Ответ

1 голос
/ 27 апреля 2011

Может быть, вы забыли установить источник данных и делегировать, если объект tableview установил его, как показано ниже

tbl.delegate = self;
tbl.dataSource = self;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...