Обнаружение UIButton при использовании пользовательского UITableViewCell

Я хочу реализовать пользовательский класс UITableViewCell, который состоит из подзонов, таких как метки, кнопки и изображения. Эти ячейки будут отображать контент, полученный из Интернета с использованием API.

Я не хочу реализовывать метод делегирования UITableView didSelectRowAtIndexPath как это сделает выбор всей ячейки. Только кнопка в ячейке должна иметь возможность запускать любое действие.

Кнопка подключается из раскадровки к пользовательскому UITableViewCell через IBOutlet. Метод addTarget(_:action:forControlEvents:) вызывается в UIButton в cellForRowAtIndexPath класса UITableViewController.

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

Так как indexPath для выбранной ячейки может быть обнаружен в функции Selector

@IBAction func doSomething(sender: AnyObject) {
    var location: CGPoint = sender.convertPoint(CGPointZero, toView: self.tableView)
    var indexPath: NSIndexPath = self.tableView.indexPathForRowAtPoint(location)!
    println("The indexPath for Selected Cell is - \(indexPath.row)")
}

Хотя, это успешно помогает мне в этом вопросе, мой вопрос;

1) Вы обнаружили альтернативный способ использования UIButtons для передачи выбранных данных соты в пользовательский UITableViewCell?

2) Какова была бы лучшая практика до сих пор в Swift для реализации аналогичного сценария?

+1
источник поделиться
2 ответа

Если ваш tableView имеет только один раздел, вы можете использовать свойство tag для кнопки indexPath.row.

В cellForRowAtIndexPath, когда вы устанавливаете целевое действие для кнопки, установите button.tag = indexPath.row.

Тогда в вашей doSomething рутине:

@IBAction doSomething(sender: UIButton) {
    println("This button is from row - \(sender.tag)")
}
+1
источник

Одним из способов было бы перебирать супервизоры отправителя и посмотреть, можно ли найти UITableViewCell...

Предположим, вы создали универсальное расширение UIView с помощью метода, который будет проверять, был ли какой-либо из его надписей UITableViewCell...

extension UIView {
    func parentTableViewCell() -> UITableViewCell? {
        var view = self
        while let superview = view.superview {
            if let cell = superview as? UITableViewCell {
                return cell
            } else {
                view = superview
            }
        }
        return nil
    }
}

Тогда вы можете сделать следующее...

if let cell = (sender as UIView).parentTableViewCell() {
    let indexPath = tableView.indexPathForCell(cell)
    println("The row for this cell is - \(indexPath.row)")
}

Другой способ - использовать свойство tag представления, установив его в Int, а затем проверить, чтобы увидеть, какой tag отправителя был в методе.

т.е. в вашем tableView:cellForRowAtIndexPath: метод

cell.myButton.tag = indexPath.row

Затем в вашем методе doSomething

let rowIndex = (sender as UIButton).tag
println("The row for this cell is - \(rowIndex)"
+2
источник

Посмотрите другие вопросы по меткам или Задайте вопрос