Обновить текст метки в Viewcontroller из Tableview - PullRequest
0 голосов
/ 30 июня 2018

Мой вопрос похож на тот, что здесь: Обновление label.text во время выполнения

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

После некоторых исследований я понимаю, что некоторые из них получат функцию textfieldDidEndEditing делегата текстового поля в самой ячейке, но как я получу доступ к тексту метки из viewcontroller, чтобы я мог его обновить? Я предоставлю код, который у меня есть ниже.

import UIKit
import RealmSwift

class MaterialsCell: UITableViewCell, UITextFieldDelegate{
    @IBOutlet weak var materialsDescription: UITextField!
    @IBOutlet weak var materialsQuantity: UITextField!
    @IBOutlet weak var materialsAmount: UITextField!

    func saveMaterialsData() {
        let saveMaterials = SPMaterialsRequest()
        saveMaterials.setValue(self.materialsDescription!.text, forKey: "materialDescriptiopn")
        saveMaterials.setValue(self.materialsQuantity!.text, forKey: "materialQuantity")
        saveMaterials.setValue(self.materialsAmount!.text, forKey: "materialAmount")
        let realm = try! Realm()

        do {
            try realm.write {
                realm.add(saveMaterials)
                print("added \(saveMaterials.materialDescription) to Realm Database")
                print("added \(saveMaterials.materialQuantity) to Realm Database")
                print("added \(saveMaterials.materialAmount) to Realm Database")
                print("added \(saveMaterials.materialTotal) to Realm Database")
            }
        } catch {
            print(error)
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func textFieldDidEndEditing(_ textField: UITextField) {

    }
}

import UIKit
import RealmSwift

class ServiceProMaterialsController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    @IBOutlet weak var materialsView: UITableView!
    @IBOutlet weak var materialsTotal: UILabel!

    var spMaterialsRequest: Results<SPMaterialsRequest>?

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "MaterialsCell"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? MaterialsCell
            else {
                fatalError("Dequed Cell is not an instance of MaterialsCell")
        }

        cell.materialsDescription.text = ""
        cell.materialsQuantity.text = ""
        cell.materialsAmount.text = "" 

        return cell
    }
}

1 Ответ

0 голосов
/ 30 июня 2018

Создайте пользовательский делегат, внедрите этот делегат в ваш viewcontroller. Передача делегата в ячейку при снятии очереди с ячейки и вызове этого делегата в textFieldDidEndEditing, например:

import UIKit
import RealmSwift

protocol CustomProtocol{
func textEntered(text : String,index:Int)
}

class MaterialsCell: UITableViewCell, UITextFieldDelegate{
    @IBOutlet weak var materialsDescription: UITextField!
    @IBOutlet weak var materialsQuantity: UITextField!
    @IBOutlet weak var materialsAmount: UITextField!

    var delegate : CustomProtocol?
    var index : Int?

    func saveMaterialsData() {
        let saveMaterials = SPMaterialsRequest()
        saveMaterials.setValue(self.materialsDescription!.text, forKey: "materialDescriptiopn")
        saveMaterials.setValue(self.materialsQuantity!.text, forKey: "materialQuantity")
        saveMaterials.setValue(self.materialsAmount!.text, forKey: "materialAmount")
        let realm = try! Realm()

        do {
            try realm.write {
                realm.add(saveMaterials)
                print("added \(saveMaterials.materialDescription) to Realm Database")
                print("added \(saveMaterials.materialQuantity) to Realm Database")
                print("added \(saveMaterials.materialAmount) to Realm Database")
                print("added \(saveMaterials.materialTotal) to Realm Database")
            }
        } catch {
            print(error)
        }
    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        //Usage of custom protocol
        delegate?.textEntered(text : textField.text!,index:self.index!)
    }
}

import UIKit
import RealmSwift

class ServiceProMaterialsController: UIViewController, UITableViewDataSource, UITableViewDelegate , CustomProtocol{
    @IBOutlet weak var materialsView: UITableView!
    @IBOutlet weak var materialsTotal: UILabel!

    var spMaterialsRequest: Results<SPMaterialsRequest>?

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cellIdentifier = "MaterialsCell"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? MaterialsCell
            else {
                fatalError("Dequed Cell is not an instance of MaterialsCell")
        }
        //Do 1 and 2
        cell.delegate = self // 1
        cell.index = indexPath.row //2
        cell.materialsDescription.text = ""
        cell.materialsQuantity.text = ""
        cell.materialsAmount.text = "" 

        return cell
    }

   //Implementing CustomProtocol
   func textEntered(text : String,index:Int){
      materialsTotal.text = text
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...