Как распечатать значение в UILabel из значений TableView динамически - PullRequest
2 голосов
/ 22 марта 2019

enter image description here

У меня есть tableView с пользовательской ячейкой, всякий раз, когда я нажимаю кнопку-флажок, значение внутри ячейки увеличивается, т. Е. (От 0 до 1) в ячейке, а при снятии флажка значение уменьшается, что отлично работает. Но всякий раз, когда я пытаюсь распечатать эти значения из ячейки в UILabel вне tableView, значения не меняются.

Это код ниже, который я использовал

   var data = [[String: AnyObject]]()

   func getDetails() {

    let paymentURL = paymentListURL + String(28) + "&student_id=" + String(33)

    Alamofire.request(paymentURL).responseJSON { (response) in
        if ((response.result.value) != nil) {
            var jsonVar = JSON(response.result.value!)
           print(jsonVar)

            if let da = jsonVar["types"].arrayObject {
                self.data = da as! [[String:AnyObject]]
            }
            if self.data.count > 0 {
                self.tableView.reloadData()
            }
        }
    }
}

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

    cell.checkB.tag = indexPath.row
    let ip = data[indexPath.row]
    cell.nameText.text = ip["title"] as? String
    if cell.nameText.text == "Mandatory testing" {

        cell.checkB.checkState = .checked
        cell.backgroundColor = UIColor.lightGray
        cell.checkB.backgroundColor = UIColor.lightGray
    }

    if ip["mandatory"] as? String == "yes" {
        moneyText.text = ip["amount"] as? String
       //moneyText is UILabel outside Tableview
        cell.amountValue.text = ip["amount"] as? String

        cell.checkB.isEnabled = false
    } else {
        moneyText.text = "0"
        if cell.amountValue.text == "1"{
            print("ONE")
        }
    }
    return cell
}

func didPressButton(_ tag: Int) {

    let indexPath = IndexPath.init(row: 0, section: 0)

    let cell = tableView.cellForRow(at: indexPath) as! TabCell

    moneyText.text = String(cell.someValue)        
}

А для TableviewCell я использовал

protocol TabCellDelegate {
   func didPressButton(_ tag: Int)
   }

class TabCell: UITableViewCell {

@IBOutlet weak var checkB: M13Checkbox!

@IBOutlet weak var nameText: UILabel!

@IBOutlet weak var amountValue: UILabel!

var someValue: Int = 0 {
    didSet {
        amountValue.text = "\(someValue)"
    }
}

@IBAction func checkBAction(_ sender: M13Checkbox) {
    cellDelegate?.didPressButton(sender.tag)

    if checkB.checkState == .checked {
        someValue += 1

    } else if checkB.checkState == .unchecked {
        someValue -= 1

    }       
}

}

Я попытался сначала добавить эти значения из ячейки в массив, а затем добавить все значения в массиве и распечатать в UILabel, но значения не менялись, это был только increment.ie, даже после снятия флажка значение растет.

Я пытался, даже используя протокол, он не работал для меня

Любая помощь будет оценена.

1 Ответ

1 голос
/ 22 марта 2019

Вы обновляете someValue из обработчика checkBAction внутри TabCell. Затем обработчик didSet обновит метку amountValue. По этой причине обновляется метка ячейки.

У вас нет кода, который обновляет moneyText после изменения someValue. Вы устанавливаете moneyText.text только из tableView(_:cellForRow:), но это вызывается, когда отображается ячейка, возможно, несколько раз после прокрутки и т. Д.

Вы можете сделать следующее:

  • Создать свойство делегат внутри ячейки (используйте пользовательский протокол в качестве типа)
  • Установите контроллер в качестве этого делегата
  • При изменении значения вызывать функцию этого делегата (например, вызывать контроллер)
  • Внутри этого обновите moneyText

Как идея (может не скомпилироваться, потому что у меня нет всех ваших классов):

protocol MyTabCellProtocol {
    func checkboxChanged(_ checkbox:M13Checkbox, atRow:Integer) 
}

class TabCell: UITableViewCell {
    weak delegate:MyTabCellProtocol?

    // ...
    @IBAction 
    func checkBAction(_ sender: M13Checkbox) {

        if checkB.checkState == .checked {
            someValue += 1

        } else if checkB.checkState == .unchecked {
            someValue -= 1
        }
        delegate?.checkboxChanged(self, checkB.tag)
    }
}

class MyController : UIViewController, MyTabCellProtocol {
    func checkboxChanged(_ checkbox:M13Checkbox, atRow:Integer) {
        moneyText.text = "\(checkbox.someValue)"
    }
}

Но если подумать дальше, я бы посоветовал немного переработать весь код. Проблема, которую я вижу, состоит в том, что ваш обработчик действий внутри ячейки действительно обновляет свойство someValue ячейки, но не обновляет внешнюю модель (ip["amount"]). Я думаю, что вы должны сделать это:

  • Внутри ячейки checkBAction просто вызовите делегата и предоставьте информацию об измененной строке (self.checkB.tag) и состоянии проверки. не обновите amountValue здесь!
  • В реализации делегата обновите модель ip["amount"]
  • Вызовите reloadRows(at:with:) представления таблицы для обновления ячейки
  • Затем автоматически вызывается cellForRow, после чего вы обновляете ячейку и внешнюю метку.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...