Я реализую 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 содержит только последний текстовое поле, которое имело ввод.