Как мне вызвать разные функции для каждого TextField в UITableView (Swift)? - PullRequest
0 голосов
/ 28 июня 2018

У меня есть UITableView, и моя ячейка прототипа состоит из метки и TextField. У меня также есть класс MyClass, который содержит функции func1, func2, fun3, ... У меня есть несколько ViewController, которые используют один и тот же прототип tableViewCell. Каждый viewController будет иметь экземпляр MyClass, называемый inst1, inst2 и inst3. Когда я ввожу текст в TableView FirstViewController, я хочу, чтобы каждая строка вызывала функцию из экземпляра MyClass, которая соответствует строке.

Поэтому, когда я вводю текст в строку 1 на FirstViewController, я хочу передать данные, введенные в textField, в func1 of inst1. Когда данные вводятся в строку 2 FirstViewController, я хочу, чтобы данные в текстовом поле передавались в func2 of inst1. И так далее, и так далее по строкам.

Я очень новичок в этом и буду очень признателен за помощь в выяснении, как это сделать. Дайте мне знать, если это не имеет смысла, и я могу попытаться перефразировать это. Мне действительно нужна помощь с этим. Заранее спасибо!

* Обновлен вопрос, чтобы показать мой код

Ниже мой код: FirstViewController.swift

extension FirstViewController: MyCellDelegate {
    func MyCell(_ cell: UITableViewCell, didEnterText text: String) {
        if let indexPath = tableView.indexPath(for: cell) {
            if (indexPath.hashValue == 0) {
                inst1.func1(one: text)
            }
            if (indexPath.hashValue == 1) {
                inst1.func2(two: text)
            }
        }
        totalText.text = inst1.getMyTotal()
    }
}

import UIKit

class FirstViewController: UIViewController,  UITableViewDataSource, UITableViewDelegate {
    let inst1 = MyClass()
    @IBOutlet weak var totalText: UILabel!
    @IBOutlet weak var tableView: UITableView!

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myTableCell") as! TableViewCell
        let text = cell.cellData[indexPath.row]
        cell.myTextField.tag = indexPath.row
        cell.delegate = self
        cell.myLabel.text = text
        cell.myTextField.placeholder = text
        return cell
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

TableViewCell.swift

import UIKit
protocol MyCellDelegate: class {
    func MyCell(_ cell: UITableViewCell, didEnterText text: String)
}

class TableViewCell: UITableViewCell {
    weak var delegate: MyCellDelegate?

    public var cellData: [String] = ["1","2","3","4","5","6","7","8","9","10","11"]

    @IBOutlet weak var myLabel: UILabel!

    @IBOutlet weak var myTextField: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

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

Когда я устанавливаю точку останова в расширении FirstViewController, он никогда не запускает этот код.

1 Ответ

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

В WillDisplayCell добавьте тег в UITextField. Также создайте протокол для уведомления Corrosponding viewController и установите себя в качестве делегата здесь.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
 let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier")
 cell.textField.tag = indexPath.row
 cell.delegate = self
 }

Протокол в вашем классе ячеек будет выглядеть примерно так

protocol MyCellDelegate: class {
func MyCell(_ cell: UITableViewCell, didEnterText text: String)
}

class MyCell: UITableViewCell, UITextFieldDelegate {
weak var delegate: MyCellDelegate?
override fun awakeFromNib() {
 super.awakeFromNib()
 textField.delegate = self
 }
//All the remaining code goes here


func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
textField.resignFirstResponder()
delegate?.MyCell(self, didEnterText: textField.text! )
return true
}
}

Теперь снова в вашем FirstViewController, который соответствует его делегату, сделайте это

extension FirstViewController: MyCellDelegate {
 func MyCell(_ cell: UITableViewCell, didEnterText text: String) {
 if let indexPath = tableView.indexPathForCell(cell) {
   // call whichever method you want to call based on index path
  }
 }
...