iOS Swift, обновить пользовательскую метку ячейки UITableView вне табличного представления CellForRow с использованием тега

Настройка (Swift 1.2 / iOS 8.4):

У UIViewController есть пользовательская ячейка UITableView (идентификатор = ячейка). У вас есть две кнопки (счетчик прироста / уменьшения) и метка (количество просмотров) внутри пользовательской ячейки TableView.

Цель:

Обновите ярлык, нажимая кнопку увеличения или уменьшения количества.

В настоящее время я могу получить кнопку Tag и вызвать функцию вне CellForRowAtIndexPath. Нажатие кнопки увеличивает и уменьшает счетчик. Но я не могу показать обновление счета в ярлыке.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:FoodTypeTableViewCell = self.tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! FoodTypeTableViewCell cell.addBtn.tag = indexPath.row // Button 1 cell.addBtn.addTarget(self, action: "addBtn:", forControlEvents: .TouchUpInside) cell.subBtn.tag = indexPath.row // Button 2 cell.subBtn.addTarget(self, action: "subBtn:", forControlEvents: .TouchUpInside) cell.countLabel.text = // How can I update this label return cell } func addBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton count = 1 + count println(count) return count } func subBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton if count == 0 { println("Count zero") } else { count = count - 1 } println(count) return count } 

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

Спасибо.

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

Использование Swift 2, поскольку у меня больше нет Xcode 6.x.

Начнем с подкласса UITableViewCell . Это просто тупой контейнер для ярлыка, на котором есть две кнопки. Ячейка фактически не выполняет каких-либо конкретных действий с кнопками, она просто передает вызов на замыкания, которые предоставляются в методе конфигурации. Это часть MVC. Представление не взаимодействует с моделью, просто с контроллером. И контроллер обеспечивает закрытие.

 import UIKit typealias ButtonHandler = (Cell) -> Void class Cell: UITableViewCell { @IBOutlet private var label: UILabel! @IBOutlet private var addButton: UIButton! @IBOutlet private var subtractButton: UIButton! var incrementHandler: ButtonHandler? var decrementHandler: ButtonHandler? func configureWithValue(value: UInt, incrementHandler: ButtonHandler?, decrementHandler: ButtonHandler?) { label.text = String(value) self.incrementHandler = incrementHandler self.decrementHandler = decrementHandler } @IBAction func increment(sender: UIButton) { incrementHandler?(self) } @IBAction func decrement(sender: UIButton) { decrementHandler?(self) } } 

Теперь контроллер так же прост

 import UIKit class ViewController: UITableViewController { var data: [UInt] = Array(count: 20, repeatedValue: 0) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! Cell cell.configureWithValue(data[indexPath.row], incrementHandler: incrementHandler(), decrementHandler: decrementHandler()) return cell } private func incrementHandler() -> ButtonHandler { return { [unowned self] cell in guard let row = self.tableView.indexPathForCell(cell)?.row else { return } self.data[row] = self.data[row] + UInt(1) self.reloadCellAtRow(row) } } private func decrementHandler() -> ButtonHandler { return { [unowned self] cell in guard let row = self.tableView.indexPathForCell(cell)?.row where self.data[row] > 0 else { return } self.data[row] = self.data[row] - UInt(1) self.reloadCellAtRow(row) } } private func reloadCellAtRow(row: Int) { let indexPath = NSIndexPath(forRow: row, inSection: 0) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) tableView.endUpdates() } } 

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

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

Вы можете загрузить полный рабочий пример (требуется Xcode7) с https://bitbucket.org/abizern/so-32931731/get/ce31699d92a5.zip

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

Для людей, которым трудно понять: единственная проблема, с которой мы имеем дело, – это обратиться к CellView CellView. Как только вы выясните способ ссылки на ячейку, вы можете взаимодействовать с компонентами ячейки.

 func addBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) // This defines what indexPath is which is used later to define a cell let cell = tableView.cellForRowAtIndexPath(indexPath) as! FoodTypeTableViewCell! // This is where the magic happens - reference to the cell count = 1 + count println(count) cell.countLabel.text = "\(count)" // Once you have the reference to the cell, just use the traditional way of setting up the objects inside the cell. return count } func subBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) let cell = tableView.cellForRowAtIndexPath(indexPath) as! FoodTypeTableViewCell! if count == 0 { println("Count zero") } else { count = count - 1 } cell.countLabel.text = "\(count)" println(count) return count } 

Надеюсь, кто-то выиграет от этого.

ПОЖАЛУЙСТА, ПРАВИЛЬНО, ЕСЛИ В ЭТОМ РЕШЕНИИ НЕКОТОРЫЕ ПРОБЛЕМЫ, ИЛИ ЕСТЬ ЛУЧШИЙ / ПРАВИЛЬНЫЙ ПУТЬ, ЧТОБЫ ДЕЛАТЬ ЭТО.

Используйте tableView.reloadData() для перезагрузки содержимого tableView каждый раз, когда вы нажимаете кнопку.

 let text = "something" func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:FoodTypeTableViewCell = self.tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! FoodTypeTableViewCell cell.addBtn.tag = indexPath.row // Button 1 cell.addBtn.addTarget(self, action: "addBtn:", forControlEvents: .TouchUpInside) cell.subBtn.tag = indexPath.row // Button 2 cell.subBtn.addTarget(self, action: "subBtn:", forControlEvents: .TouchUpInside) cell.countLabel.text = something return cell } func addBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton count = 1 + count println(count) something = "\(count)" self.tableView.reloadData() return count } func subBtn(sender: AnyObject) -> Int { let button: UIButton = sender as! UIButton if count == 0 { println("Count zero") } else { count = count - 1 } println(count) something = "\(count)" self.tableView.reloadData() return count } 

Update1

После ваших комментариев … у вас есть массив (одно значение для каждой пищи), как это, и всякий раз, когда вы нажимаете кнопку, вы берете индекс строки, содержащий эту кнопку, затем используйте этот индекс для извлечения значения count из вашего массива , а затем перезагрузите содержимое представления таблицы.

  • UITableView автоматически не отменяет выбранную строку, когда таблица снова появляется
  • UITableViewCell из пользовательского .XIB-файла не создает точек
  • Неверная перенос текста в UITableViewCell
  • Пользовательская проблема прокрутки таблицы на ячейках
  • Как реализовать представление, которое отображается как календарь в календаре?
  • UITableView с UISearchController переходит под панель навигации при входе в результирующее представление и возвращается
  • UITableView + Core Animation
  • как перезагрузить tableview другого uiviewcontroller в текущем диспетчере представлений
  • Случайный UISearchDisplayController Crash (iOS 7)
  • Как вы можете получить выбранные строки из UITableView?
  • hidesBarsOnSwipe для childView
  • Давайте будем гением компьютера.