Как сохранить ввод текстового поля из ячейки прототипа Dynami c в Swift - PullRequest
0 голосов
/ 01 апреля 2020

Я реализую tableView с динамическими c прототипами ячеек. Каждая ячейка имеет метку, указывающую необходимый ввод, и текстовое поле, которое получает ввод от пользователя. TableViewController устанавливается как делегат для ячеек прототипа. Когда вызывается tableViewController textFieldShouldReturn , я обращаюсь к этому textField через его тег и сохраняю входные данные в свойстве. Когда я готовлюForSegue к предыдущему viewController, создаю экземпляр класса и сохраняю все свойства в этом классе. В возврате из seque в предыдущем viewController я обращаюсь к классу в tableViewController, который получил текстовые входные данные, только последний введенный textField имеет какие-либо данные. Я подозреваю, что это потому, что каждое из свойств, которое получает ввод текста, очищается между вызовами textFieldShouldReturn , поскольку это переменные экземпляра, которые будут иметь время жизни только до тех пор, пока они содержат tableViewContoller. Если бы я писал это в target- C, я бы просто объявил эти переменные как strong , но в Swift, похоже, нет никакого способа сделать это. Цени любую помощь!

Прототип ячейки класса:

    //
//  PatientTableViewCell.swift
//  emspcr`enter code here`
//
//  Created by Nelson Capes1 on 6/9/19.
//  Copyright © 2019 Nelson Capes. All rights reserved.
//

import UIKit

class PatientTableViewCell: UITableViewCell, UITextFieldDelegate {
    @IBOutlet weak var promptLabel: UILabel!
    @IBOutlet weak var promptText: UITextField!
    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
    }

}

Переменные в tableViewController:

var firstname : String = ""
var lastname : String = ""
var fullname : String = ""
var middlename : String = ""
var dateofbirth : String = ""
var gender : String = ""
var addr1 : String = ""
var addr2 :String = ""
var city : String = ""
var state : String = ""
var zip : String = ""
var phone : String = ""

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


    // Configure the cell...
    let cellIdentifier = "patientTableViewCell"

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

    let row = indexPath.row
    cell.promptLabel.text = promptsArray[row]
    cell.promptText.delegate = self
    cell.promptText.tag = row
    switch row {
    case 0:
        cell.promptText.placeholder = "Enter First Name"
        if(self.firstname != ""){
            cell.promptText.text = self.firstname
        }

    case 1:
        cell.promptText.placeholder = "Enter Middle Name"
        if(self.middlename != ""){
            cell.promptText.text = self.middlename
        }
    case 2:
        cell.promptText.placeholder = "Enter Last Name"
        if(self.lastname != ""){
            cell.promptText.text = self.lastname
        }
    case 3:
        cell.promptText.placeholder = "Enter Date of Birth (MM/DD/YYYY)"
        if(self.dateofbirth != ""){
            cell.promptText.text = self.dateofbirth
        }
    case 4:
        cell.promptText.placeholder = "Enter Gender (M/F/O)"
        if(self.gender != ""){
            cell.promptText.text = self.gender
        }
    case 5:
        cell.promptText.placeholder = "Enter Street Address"
        if(self.addr1 != ""){
            cell.promptText.text = self.addr1
        }
    case 6:
        cell.promptText.placeholder = "Enter Street Address 2"
        if(self.addr2 != ""){
            cell.promptText.text = self.addr2
        }
    case 7:
        cell.promptText.placeholder = "Enter City"
        if(self.city != ""){
            cell.promptText.text = self.city
        }
    case 8:
        cell.promptText.placeholder = "Enter State"
        if(self.state != ""){
            cell.promptText.text = self.state
        }
    case 9:
        cell.promptText.placeholder = "Enter Zip Code"
        if(self.zip != ""){
            cell.promptText.text = self.zip
        }
    case 10:
        cell.promptText.placeholder = "Enter Phone Number"
        if(self.phone != ""){
            cell.promptText.text = self.phone
        }
    default:
        fatalError("Invalid indexpath")
    }
   // cell.promptText.text = item?.LastName

    return cell
}

textFieldShould Возврат

func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    print(textField.tag)
    switch textField.tag{
    case 0:
        self.firstname = textField.text!
      //  item?.FirstName = textField.text!
    case 1:
        self.middlename = textField.text!
      //  item?.MiddleName = textField.text!
    case 2:
        self.lastname = textField.text!
      //  item?.LastName = textField.text!
    case 3:
        self.dateofbirth = textField.text!
      //  item?.DateOfBirth = textField.text!
    case 4:
        self.gender = textField.text!
      //  item?.Gender = textField.text!
    case 5:
        self.addr1 = textField.text!
      //  item?.StreetAddress = textField.text!
    case 6:
        self.addr2 = textField.text!
      //  item?.StreetAddress2 = textField.text!
    case 7:
        self.city = textField.text!
      //  item?.CityAddress = textField.text!
    case 8:
        self.state = textField.text!
     //   item?.StateAddress = textField.text!
    case 9:
        self.zip = textField.text!
     //   item?.ZipCode = textField.text!
    case 10:
        self.phone = textField.text!
      //  item?.PhoneNumber = textField.text!
    textField.resignFirstResponder()

prepareForSeque (обратите внимание, что переменные терпения устанавливаются из переменных в tableViewController, получающих ввод textField

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        switch segue.identifier{
case "unwindToInitialTableViewController" :
            self.item = patientItem(FirstName: firstname, MiddleName: middlename, LastName: lastname, FullName: fullname, DateOfBirth: dateofbirth, Gender: gender, StreetAddress: addr1, StreetAddress2: addr2, CityAddress: city, StateAddress: state, ZipCode: zip, PhoneNumber: phone, Assessments: [])

Seque return в предыдущем viewController

@IBAction func unwindFromPatientDetail(sender: UIStoryboardSegue) {
    print ("unwind from patient detail")
    if let sourceViewController = sender.source as? PatientDetailTableViewController, let item = sourceViewController.item{

        if let selectedIndexPath = tableView.indexPathForSelectedRow {
            // update an existing patient
            patients[selectedIndexPath.row] = item
            tableView.reloadRows(at: [selectedIndexPath], with: .none)
        } else{
            // add a new patient
            let newIndexPath = IndexPath(row: patients.count, section: 0)
            patients.append(item)
            tableView.insertRows(at: [newIndexPath], with: .automatic)
        }
        // save the patients
        savePatients()
    }
}

Точка останова здесь показывает, что item содержит только последний текстовое поле, которое имело ввод.

...