it-roy-ru.com

Как получить значения текстовых полей из UITableViewCell?

Итак, у меня есть ячейка thisUITableView, которая имеет 4 UITextField, и я хочу получить их значения при нажатии кнопки.

Этот код не получает никаких значений.

@IBAction func printBtnAction(_ sender: Any) {

    let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell

    let alias = cell.aliasTextField.text!
    let primaryPhone = cell.primaryPhoneTextField.text!
    let secondaryPhone = cell.seondaryPhoneTextField.text!
    let email = cell.emailAddressTextField.text!

    print("Alias: \(alias), Phone: \(primaryPhone), Phone2: \(secondaryPhone), Email: \(email)")
}

Это скриншот TableView  enter image description here

3
Chris Mikkelsen

Я наконец понял это с этим простым решением.

@IBAction func saveBtnAction(_ sender: Any) {

    let index = IndexPath(row: 0, section: 0)
    let cell: AddFriendC1Cell = self.myTableView.cellForRow(at: index) as! AddFriendC1Cell
    self.alias = cell.aliasTextField.text!
    self.primaryPhone = cell.primaryPhoneTextField.text!
    self.secondaryPhone = cell.seondaryPhoneTextField.text!
    self.email = cell.emailAddressTextField.text!

    print("Alias: \(self.alias), Phone: \(self.primaryPhone), Phone2: \(self.secondaryPhone), Email: \(self.email)")
}
12
Chris Mikkelsen

ХОРОШО. Вы отменяете tableViewCell при нажатии на кнопку.

let cell = self.myTableView.dequeueReusableCell(withIdentifier: "manualAddC1") as! AddFriendC1Cell

Я считаю, что вы хотите получить ссылку на существующий tableViewCell, как это:

   if let cell = tableView.cellForRow(at: indexPath) as? AddFriendC1Cell {
        // do what you need with cell
    }

Даже если это сработает, я бы не предложил такой подход. Что если пользователь использует телефон с меньшим экраном, например iPhone 4, и некоторые ячейки не видны на экране? Я думаю, что в этом случае tableView.cellForRow вернет nil для невидимой ячейки.

Я бы предложил реализовать textField:shouldChange в каждой ячейке с текстовым полем с делегатом для viewController tableView. Когда текст изменяется в ячейке, делегат должен распространить это изменение на viewController, который сохранит значение в переменной экземпляра.

Затем, когда вы нажимаете на кнопку, вы просто берете значения из переменных экземпляра.

6
JPetric

По моему мнению, вы должны реализовать методы делегатов TextField в классе tableCell и управлять всеми проверками и вводимым текстом в классе tableCell. 

Теперь вам нужно извлечь все введенные значения, для этого вам нужно использовать Protocol в классе tableCell и отправить введенное значение с помощью делегата viewController также с тегом для идентификации того, какое значение было введено, например, номер телефона или адрес электронной почты.

Таким образом, ваш код будет сокращен и структурирован.

Удачного кодирования!

0
iDev750

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellID") as! YourClass
    cell.yourTextField.tag = indexPath.row
//
// Alias will be tag 0
// Primary Phone will be tag 1
// Secondary Phone will be tag 2 
// Email Address will be tag 3, so on and so forth
// Then, attach to each delegate
//
    cell.yourTextField.delegate = self
}

Напишите это в своем классе обработки UITableView (который соответствует протоколу UITextFieldDelegate).

func textField(_ textField: UITextField, shouldChangeCharactersIn range:NSRange, replacementString string: String) -> Bool {
let kActualText = (textField.text ?? "") + string
switch textField.tag
{
case 0:
    aliasValueHolder = kActualText;
case 1:
    primaryPhoneValueHolder = kActualText;
case 2:
    secondaryPhoneValueHolder = kActualText;
case 3:
    emailAddressValueHolder = kActualText;
default:
    print("It is nothing");
}
return true;
}

Затем вы можете отправить его.

0
Cosmos Man