UITableViewCell подкласс, как рисовать кнопки? - PullRequest
0 голосов
/ 21 августа 2011

Я создаю приложение, которому нужны три кнопки в каждой ячейке таблицы. Я попытался просто добавить кнопки в ячейку, используя addSubview в cellForRowAtIndexPath:, но это привело к медленной / резкой прокрутке с более чем 6 или 7 строками.

Я провел некоторые онлайн-исследования и следовал примеру Apple, который дал подкласс UITableViewCell и нарисовал все в drawRect. Я могу заставить текст и изображения рисовать идеально, используя drawAtPoint, но это не работает для кнопок UIB.

Добавление кнопки в качестве подпредставления [self contentView] (в моих подклассах drawRect) приводит к еще большему отставанию прокрутки, чем раньше.

Кто-нибудь знает, как заставить кнопку правильно рисовать в моем подклассе UITableViewCell?

Правильное понимание этого имеет решающее значение для всего приложения, поэтому любая помощь будет принята с благодарностью!

ОБНОВЛЕНИЕ: Вот код, используемый для tableView:cellForRowAtIndexPath

static NSString *CellIdentifier = @"CustomCell";

AHCustomCell * cell = (AHCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    AHCustomCell * customCell = [[[AHCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    customCell.frame = CGRectMake(0.0, 0.0, 320.0, 55.0);
    cell = customCell;
}

Ответы [ 3 ]

1 голос
/ 22 августа 2011

Следующий код дает три кнопки и без прокрутки. Используя теги, вы можете сбросить текст кнопок в зависимости от строки. Это показано для кнопки 1 (которая корректирует свой заголовок в соответствии с номером строки). Показанный метод button1Pressed: показывает, из какой строки произошло нажатие кнопки. Надеюсь, это будет полезно.

- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* cellIdentifier = @"Cell";

    // see if there's a cell available to recylce
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    {
        // there's no cell to recycle, so make a new one
        // add three buttons to it and tag them so we can alter their contents later

        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier];

        UIButton* button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button1 setTitle:@"Button 1" forState:UIControlStateNormal];
        [button1 setFrame:CGRectMake(4.0, 15.0, 110, 30.0)];
        [button1 setTag:101];
        [button1 addTarget:self action:@selector(button1Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button1];

        UIButton* button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button2 setTitle:@"Button 2" forState:UIControlStateNormal];
        [button2 setFrame:CGRectMake(120.0, 15.0, 80.0, 30.0)];
        [button2 setTag:102];
        [button1 addTarget:self action:@selector(button2Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button2];

        UIButton* button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button3 setTitle:@"Button 3" forState:UIControlStateNormal];
        [button3 setFrame:CGRectMake(210, 15.0, 80.0, 30.0)];
        [button3 setTag:103];
        [button3 addTarget:self action:@selector(button3Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button3];

    }

    // either on a recycled cell or on the cell just created, set the contents

    UIButton* button1 = (UIButton*)[[cell contentView] viewWithTag:101];
    [button1 setTitle: [NSString stringWithFormat:@"Button 1 - %d", [indexPath row]] forState:UIControlStateNormal];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}



- (void) button1Pressed: (UIButton*) button
{
   CGPoint buttonCentre = [button convertPoint:[button center] toView:[self tableView]];

    NSLog(@"Button 1 Pressed on row %d", [[[self tableView] indexPathForRowAtPoint:buttonCentre] row]);
}
0 голосов
/ 22 августа 2011

Вы действительно не можете нарисовать UIButton в -drawRect:, если вы действительно не создаете кнопку с нуля (т.е. без использования класса UIButton).Однако вы можете изменить кадр кнопки UIB в -drawRect.Вам может потребоваться вызвать -setNeedsDisplay внутри вашего -tableView:cellForRowAtIndexPath: метода для принудительного выполнения drawRect:.

Код для подкласса UITableViewCell может выглядеть следующим образом:

@synthesize button = _button;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
   if (self) 
   {         
      _button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
      [self.contentView addSubview:_button];
   }
   return self;
}

- (void)dealloc 
{
    [_button release];
    [super dealloc];    
}

- (void)drawRect:(CGRect)frame
{   
    _button.frame = CGRectMake(20.0f, 5.0f, 100.0f, 30.0f);
}
0 голосов
/ 21 августа 2011

Если все UITableViewCell имеют один и тот же формат, но с разной информацией, я бы предложил создать подкласс UITableViewCell, который знает, как форматировать ячейку с каким-либо объектом Model, и подключенсобственный nib.Таким образом, вы можете легко загрузить новую ячейку в вашем методе cellForRowAtIndexPath:, и это должно значительно ускорить ваше приложение.Также намного проще вносить изменения в пользовательские ячейки и проще в реализации.Есть множество учебников онлайн о том, как это сделать. Здесь - это то, что я только что нашел в Google.Надеюсь, это поможет!

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