Добавить кнопку в UITableViewCell Accessory View

Цель: когда пользователь выбирает ячейку, в эту ячейку добавляется кнопка. В моей функции didSelectRowAtIndexPath у меня есть следующее:

UIButton *downloadButton = [[UIButton alloc] init];
downloadButton.titleLabel.text = @"Download";
[downloadButton setFrame:CGRectMake(40, 0, 100, 20)];
[[self.tableView cellForRowAtIndexPath:indexPath].accessoryView addSubview:downloadButton];
[[self.tableView cellForRowAtIndexPath:indexPath].accessoryView setNeedsLayout];

[downloadButton release];

К сожалению, это ничего не делает. Могу ли я перерисовать коррекцию клеток? Нужно ли добавлять его другим способом?

Ответы

Ответ 1

Попробуйте этот блок кода вместо блока, который вы указали выше:

UIButton *downloadButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[downloadButton setTitle:@"Download" forState:UIControlStateNormal];
[downloadButton setFrame:CGRectMake(0, 0, 100, 35)];
[tableView cellForRowAtIndexPath:indexPath].accessoryView = downloadButton;

Это должно отображать кнопку, но вам все равно нужно подключить к ней какой-то селектор с помощью addTarget. (Я не уверен, что если прослушивание делегата accessoriesButtonTappedForRowWithIndexPath будет работать в этом случае, попробуйте это сначала и посмотрите, срабатывает ли он на вашей кнопке.)

Ответ 2

Назначьте кнопку в качестве вспомогательного вида, а не в виде надзора в аксессуаре.

UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
cell.accessoryView = downloadButton;

Ответ 3

У меня была та же проблема. Попытка установить аксессуар в UIButton, у которого было изображение, не вызвало его.

Трюк состоял в том, чтобы вызвать [UIButton sizeToFit], чтобы убедиться, что его кадр установлен правильно.

Ответ 4

Попробуйте следующее:

[[self.tableView cellForRowAtIndexPath:indexPath].contentView addSubview:downloadButton];

И не забудьте удалить эту кнопку, когда ячейка повторно используется.

Ответ 5

Вот мой пример полного решения вашего запроса:

В моем подклассе UITableViewCell (я называю это RNWNewItemCell):

-(void)configureCell...
{
   // create the button
   self.btnSeekDuplicate = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 22, 22)];
   // just make it yellow until we get our real image..
   self.btnSeekDuplicate.backgroundColor = [UIColor yellowColor];
   // add the handler for the button press
   [self.btnSeekDuplicate addTarget:self
                             action:@selector(seekDuplicateButtonWasPressed) 
                   forControlEvents:UIControlEventTouchUpInside];
   // make it visible in the table cell...
   [self setAccessoryView:self.btnSeekDuplicate];
}

- (void)seekDuplicateButtonWasPressed
{
    do something...
}

В моем табличном коде, который использует ячейку...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   ...
   RNWNewItemCell *aNewItemCell = [tableView dequeueReusableCellWithIdentifier:cellIdentifierForNewItemCell forIndexPath:indexPath];
   [aNewItemCell configureCell...]
   ...
}

Обратите внимание, что аксессуарButtonTappedForRowWithIndexPath НЕ вызывается, когда вы устанавливаете аксессуар таблицы table. Вероятно, потому что они предполагают, что вы используете представление, которое реагирует на события.

Ответ 6

Всегда лучше добавлять любые представления, добавляемые в ячейку, к cell.contentView. Также попробуйте проверить, нет ли аксессуара.

Ответ 7

Swift

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    let accessoryButton = UIButton.buttonWithType(UIButtonType.ContactAdd) as! UIButton
    cell.accessoryView = accessoryButton

    return cell
}

Ответ 8

используйте это:

cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;

Ответ 9

let button = UIButton(type:.roundedRect)
button.setTitle("A", for: .normal)
button.sizeToFit()
cell.accessoryView = button