Подтвердить что ты не робот

Как получить доступ к содержимому пользовательской ячейки в swift с помощью тега кнопки?

У меня есть приложение с пользовательской кнопкой в ​​пользовательской ячейке. Если вы выберете ячейку, она перейдет к подробному представлению, что идеально. Если я выбираю кнопку в ячейке, код ниже печатает индекс ячейки в консоли.

Мне нужно получить доступ к содержимому выбранной ячейки (с помощью кнопки) и добавить их в массив или словарь. Я новичок в этом, поэтому стараюсь выяснить, как получить доступ к содержимому ячейки. Я попытался использовать didselectrowatindexpath, но я не знаю, как заставить индекс быть тегом тега...

В принципе, если в каждой ячейке есть 3 ячейки с "Собака", "Кошка", "Птица", как cell.repeatLabel.text, и я выбираю кнопки в строках 1 и 3 (Индекс 0 и 2), он должен добавить "Dog" и "Bird" в массив/словарь.

    // MARK: - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return postsCollection.count
}

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

    let cell: CustomCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell

    // Configure the cell...
    var currentRepeat = postsCollection[indexPath.row]
    cell.repeatLabel?.text = currentRepeat.product
    cell.repeatCount?.text = "Repeat: " + String(currentRepeat.currentrepeat) + " of " + String(currentRepeat.totalrepeat)

    cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton

    cell.checkButton.tag = indexPath.row;

    cell.checkButton.addTarget(self, action: Selector("selectItem:"), forControlEvents: UIControlEvents.TouchUpInside)


    return cell

}

func selectItem(sender:UIButton){

    println("Selected item in row \(sender.tag)")

 }
4b9b3361

Ответ 1

ВАРИАНТ 1. Обработка с помощью делегирования

Правильный способ обработки событий, запущенных из подкатегорий соты, заключается в использовании делегирования.

Итак, вы можете выполнить следующие шаги:

1. Выше вашего определения класса напишите протокол с единственным методом экземпляра внутри вашей пользовательской ячейки:

protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 

2. Внутри определения класса объявите переменную делегата и вызовите метод протокола для делегата:

var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

3. Соответствует CustomCellDelegate в классе, где отображается ваш вид таблицы:

 class ViewController: CustomCellDelegate

4. Установите делегат ячейки

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomCell
    cell.delegate = self

    return cell
}

5. Внедрите требуемый метод в класс контроллера вида.

EDIT: Сначала определите пустой массив и затем измените его следующим образом:

private var selectedItems = [String]()

func cellButtonTapped(cell: CustomCell) {
    let indexPath = self.tableView.indexPathForRowAtPoint(cell.center)!
    let selectedItem = items[indexPath.row]

    if let selectedItemIndex = find(selectedItems, selectedItem) {
        selectedItems.removeAtIndex(selectedItemIndex)
    } else {
        selectedItems.append(selectedItem)
    }
}

где items - это массив, определенный в моем контроллере представления:

private let items = ["Dog", "Cat", "Elephant", "Fox", "Ant", "Dolphin", "Donkey", "Horse", "Frog", "Cow", "Goose", "Turtle", "Sheep"] 

ВАРИАНТ 2. Обработка с помощью закрытий

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

1. Объявить переменную закрытия внутри вашего класса ячейки:

var tapped: ((CustomCell) -> Void)?

2. Вызовите закрытие внутри обработчика кнопок.

@IBAction func buttonTapped(sender: AnyObject) {
    tapped?(self)
}

3. В tableView(_:cellForRowAtIndexPath:) в классе контроллера класса просмотра:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell       
cell.tapped = { [unowned self] (selectedCell) -> Void in
    let path = tableView.indexPathForRowAtPoint(selectedCell.center)!
    let selectedItem = self.items[path.row]

    println("the selected item is \(selectedItem)")
}

Ответ 2

Поскольку у вас есть 1 раздел в представлении таблицы, вы можете получить объект ячейки, как показано ниже.

let indexPath = NSIndexPath(forRow: tag, inSection: 0)
let cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell!

где тег вы получите от тега кнопки.

Ответ 3

Swift 3 Я просто получаю решение для ячейки доступа в функции @IBAction, используя супервизор тега кнопки.

let cell = sender.superview?.superview as! ProductCell
var intQty = Int(cell.txtQty.text!);
intQty = intQty! + 1
let  strQty = String(describing: intQty!);
cell.txtQty.text = strQty

Ответ 4

@IBAction func buttonTap(sender: UIButton) {
        let button = sender as UIButton
        let indexPath = self.tableView.indexPathForRowAtPoint(sender.center)!
}

Ответ 5

Я обновил вариант 1 ответа от Василя Гарова для Swift 3

1. Создайте протокол для CustomCell:

protocol CustomCellDelegate {
    func cellButtonTapped(cell: CustomCell)
} 

2.. Для TableViewCell объявите переменную delegate и вызовите на ней метод протокола:

var delegate: CustomCellDelegate?

@IBAction func buttonTapped(sender: AnyObject) {
    delegate?.cellButtonTapped(self)
}

3. Соответствует CustomCellDelegate в классе, где ваш tableView:

 class ViewController: CustomCellDelegate

4. Установите ячейку delegate

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)  as CustomCell
    cell.delegate = self

    return cell
}

5. Внесите требуемый метод в ViewController.

Ответ 6

На основе ответа Cao, это решение для обработки кнопок в ячейке просмотра коллекции.

    @IBAction func actionButton(sender: UIButton) {
        let point = collectionView.convertPoint(sender.center, fromView: sender.superview)
        let indexPath = collectionView.indexPathForItemAtPoint(point)
}

Имейте в виду, что вызов функции convertPoint() преобразует координаты точки кнопки в пространстве просмотра коллекции. Без, indexPath всегда будет ссылаться на тот же номер ячейки 0

Ответ 7

XCODE 8: Важное примечание

Не забудьте установить теги на другое значение, отличное от 0.

Если вы попытаетесь создать объект с тегом = 0, это может сработать, но в некоторых странных случаях это не так.

Исправление состоит в том, чтобы установить теги на разные значения. Надеюсь, это поможет кому-то.