Добавить кнопку в 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