如何为UITableView(Swift)中的每个TextField调用不同的函数?

时间:2018-06-28 02:14:15

标签: swift uitextfield tableview action

我有一个UITableView,我的原型单元由一个标签和一个TextField组成。我还有一个类MyClass,其中包含函数func1,func2,fun3,...我有几个使用相同tableViewCell原型的ViewController。每个viewController都有一个MyClass实例,分别称为inst1,inst2和inst3。当我在FirstViewController的TableView中输入文本时,我希望每一行都从与该行相对应的MyClass实例中调用一个函数。

因此,当我在FirstViewController的第1行中输入文本时,我想将输入到textField中的数据传递到inst1的func1中。当数据输入到FirstViewController的第2行时,我希望将文本字段中的数据传递到inst1的func2中。依此类推,直到行。

我对此很陌生,非常感谢您提供一些帮助,以帮助您解决该问题。让我知道这是否没有道理,我可以尝试重新表述。我真的需要帮助。预先感谢!

*更新问题以显示我的代码

以下是我的代码: 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 :(得分:1)

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
  }
 }