Как я могу напечатать indexPath ячейки TableView, содержащей UITextField, из одной из функций делегата TextField? - PullRequest
0 голосов
/ 20 марта 2020

Здесь я создаю свои пользовательские ячейки, в которых хранится атрибут «indexPath». Кроме того, каждая ячейка содержит UITextField. Функция делегата текстового поля ниже. Обе эти функции существуют в одном и том же ViewController.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! BuyerCell

    cell.nameField.delegate = self
    cell.indexPath = indexPath
    cell.nameField.text = potentialBuyers[indexPath.row]
    return cell
}


Вот функция делегата TextField. Мне нужно напечатать indexPath ячейки из функции делегата.

func textFieldDidEndEditing(_ textField: UITextField) {
    print("called textFieldDidEndEditing")

    //I need to print the cell's indexPath here 

}

Ответы [ 5 ]

0 голосов
/ 20 марта 2020
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! BuyerCell

cell.nameField.delegate = self
cell.indexPath = indexPath
cell.nameField.text = potentialBuyers[indexPath.row]
// add tag for the textField
cell.nameField.tag = indexPath.row
return cell

}

Теперь в методе textFieldDelegate получите вашу ячейку и cell.indexPath вот так

func textFieldDidEndEditing(_ textField: UITextField) {
    print("called textFieldDidEndEditing")

    let cell = tableView.cellForRow(at: IndexPath(row: textField.tag, section: 0)) as! BuyerCell
    print(cell.indexPath)

}
0 голосов
/ 20 марта 2020

вы можете использовать свойство .tag UITextfeild

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

     let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! BuyerCell

     cell.nameField.delegate = self
     cell.indexPath = indexPath
     cell.nameField.text = potentialBuyers[indexPath.row]
     cell.nameField.tag = indexPath.row // here assign the indexpath
     return cell
}

Теперь используйте метод делегата UITextField

func textFieldDidEndEditing(_ textField: UITextField) {
      print(textField.tag) // here you print the index
      print("called textFieldDidEndEditing")
      let indexPath = IndexPath.init(row: textField.tag, section: 0) //create indexpath from tag

 }
0 голосов
/ 20 марта 2020

Попробуйте этот код ниже.

func textFieldDidEndEditing(_ textField: UITextField) {
    let gpoint = textField.convert(CGPoint.zero, to: tableView)
    let indexPath = tableView.indexPathForRow(at: gpoint)
}
0 голосов
/ 20 марта 2020

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! BuyerCell
    let buyer = potentialBuyers[indexPath.row]

    cell.nameEditedHandler = { textField in
        // Do something - you still have access to indexPath, cell and buyer
    }

    cell.nameField.text = buyer
    return cell
}

В вашем BuyerCell классе -

class BuyerCell: UITableViewCell {
    var nameField: UITextField!

    var nameEditedHandler: ((UITextField)->Void)?

    func awakeFromNib() {
        super.awakeFromNib()
        self.nameField.delegate = self
    }
}

extension BuyerCell: UITextFieldDelegate {
    func textFieldDidEndEditing(_ textField: UITextField) {
        self.nameEditedHandler?(textField)
    } 
}
0 голосов
/ 20 марта 2020

Добро пожаловать в Stackoverflow. Я могу придумать несколько способов сделать это, даже не проверяя эти идеи.

Подклассы

Есть свой собственный подкласс UITextField и поместите туда переменную для хранения объект IndexPath и в cellForRow сохранить текущий IndexPath в этом textField.

Таким образом, в вашем делегате textField textFieldDidEndEditing вы можете либо изменить тип UITextField на свой собственный класс, например MyTextField. ИЛИ вы можете просто привести его следующим образом:

if let customTextField = textField as? MyTextField

Сохранение строки как TAG

Это намного проще, но, возможно, ограничивается только одним разделом tableView. Если вы используете один раздел, то вы можете просто сохранить row из IndexPath в вашем cellForRow в свойстве TAG textField.

...