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 } 

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

Спасибо.

3 Solutions collect form web for “iOS Swift, обновить пользовательскую метку ячейки UITableView вне табличного представления CellForRow с использованием тега”

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

Использование 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 для повторного использования пользовательских ячеек Swift
  • Принудительное касание UICollectionView внутри UITableViewCell
  • Swift: возврат к просмотру таблицы после выбора результата поиска
  • Как оптимизировать рендеринг UITableViewCell при использовании CGContextDrawLinearGradient
  • Как уменьшить время, когда UITableView добавил несколько NSURL UIImage на ячейку, UIBlocked
  • MPMediaQuery для возврата только локальных элементов
  • Выполнение прокрутки UITableView при выборе текстового поля
  • Отображение большого количества RichText: выбор наилучшего варианта
  • Ячейки в UITableView перекрываются. Многие ячейки в одном месте
  • Каков наилучший способ загрузки ландшафтных и портретных xib-файлов для uitableviewcells?
  • Как оживить изменение высоты заголовка раздела в UITableView?
  • Interesting Posts

    Ширина UITabBar не увеличивается с размером экрана

    Клиент RTSP / RTMP для потокового видео iOS

    iOS TableView с пейджингом?

    Этот класс не является ключевым значением, совместимым с кодировкой для ключевого признака

    CLRegionState UnKnown Когда я в регионе

    iOS – файл не содержит фрагмент armv7s

    Обнаружение отмененного входа в систему itunes для покупок в приложении

    NSOperation Queue ведет себя ненормально

    Как заставить моего персонажа «кататься» вместе с движущимися платформами?

    Почему пример приложения iOS в XCode 6 проверяет ноль необязательной переменной?

    Как добавить слайд для разблокировки эффекта в UITextView или UILabel?

    Локальная логика UICollectionView отсутствует в горизонтальном просмотре прокрутки

    Ошибка синхронизации приложения Ford

    Как вы устанавливаете CMAKE_C_COMPILER и CMAKE_CXX_COMPILER для создания Assimp для iOS?

    Установить цвет фона для раздела UICollectionView?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.