Как получить доступ к содержимому пользовательской ячейки в 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)")
}
Ответы
Ответ 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, это может сработать, но в некоторых странных случаях это не так.
Исправление состоит в том, чтобы установить теги на разные значения.
Надеюсь, это поможет кому-то.