Как реализовать «didSelectButtonInCellAtIndexPath:» в Objective-C и Swift? - PullRequest
0 голосов
/ 27 августа 2018

Я знаком с 'UITableViewDelegate'.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath имеет силу.

Как реализовать "tableView: didSelectButtonInCellAtIndexPath:", точно в Objective-C, также великолепно в Swift.

как показано на следующем рисунке:

pic

Когда нажимается кнопка в красном круге, я использую пользовательский делегат UITableViewCell.

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

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вместо Делегат Я предпочитаю использовать Блок (Objective-C) или Закрытие (Swift)

Это примерНасколько элегантно можно легко управлять действиями с кнопками, если необходимо обновить ячейку, тогда это также можно легко выполнить, не нужно обновлять весь просмотр таблицы и все.

В Objective-C:

CustomTableViewCell.h

@property (nonatomic, weak) IBOutlet UIButton *button;
@property (nonatomic, copy) void (^ButtonTapAction)(CustomTableViewCell *aCell);

CustomTableViewCell.m

//Method assign to that button
- (IBAction)arrowButtonTapped:(id)sender
{
    if (self.ButtonTapAction) {
        self.ButtonTapAction(self);
    }
}

ячейка Используется в tableview cellForRowAtIndexpath:

__weak typeof(self) weakSelf = self;
        cell.arrowButtonTapAction = ^(CustomTableViewCell *aCell){
            // Do Whatever you want to do on the button click
        };

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

In Swift:

CustomTableCell.swift

typealias  ButtonHandler = (_ aCell:CustomTableCell) -> Void
var buttonClickHandler:ButtonHandler? = nil

@IBAction func buttonClick(_ sender: Any) {
        if buttonClickHandler != nil {
            self.buttonClickHandler!(self)
        } 
    }

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

cell.buttonClickHandler = { aCell in
      // Do Whatever you want to do on the button click
}

Используя этот код, вам не нужно перезагружать Cell.Кроме того, нет необходимости поддерживать его indexpath, и все вещи просто обновляют все, что вы хотите сделать или нуждались в каких-либо действиях для кнопки, просто напишите в cellForIndexpath, который установлен.

Выше для For нажатием одной кнопки в строке.Для выбора целой строки вы можете реализовать DidSelectRow Delegate

0 голосов
/ 27 августа 2018

Это очень просто, и на самом деле есть несколько способов достичь того, что вы хотите:

  1. Использовать блоки кода. Вы можете использовать блок кода в качестве обработчика выбора кнопки, например var buttonSelectionHandler: ((_ index: IndexPath?) -> ())?, и вызывать его на селекторе своей кнопки. Параметр index блока, который вы можете использовать, чтобы указать, какая ячейка отвечает за действие, и не забывайте, что вы должны хранить индексный путь в cellForRowAtIndex из UITableViewDataSource и иметь правильное свойство в пользовательской ячейке.

  2. Создайте собственный протокол, который имеет функцию, как вы сказали в вопросе к протоколу, создайте свой контроллер представления, или просмотрите модель или любую другую вещь, которую вы используете в качестве UITableViewDataSource для подтверждения этого протокола, добавьте свойство, которое тип этого протокола, назначьте объект реализации свойству и вызывайте метод всякий раз, когда нажимается кнопка.

Есть и другие способы, но я думаю, этого будет достаточно, чтобы решить вашу проблему. Надеюсь, это поможет!

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