¿Cómo devolver datos a ViewController con Container View y TableViewController que está incrustado en el Contenedor? Swift 3
¿Cómo puedo llamar a func checkField cuando se toca nextButton? Si ningún campo está vacío en ManagedTableEleventhViewController, me gustaría pasar a TwelvethViewController.
Tengo un UIViewControllerElevethViewController
que tiene una vista de contenedor. La vista del contenedor tiene una incrustación segue a un UITableViewControllerManagedTableEleventhViewController
. DeElevethViewController
hay un Show segue a un UIViewControllerTwelevethViewController
La jerarquía de vista se ve así:
ElevethViewController
Container View
ManagedTableEleventhViewController embedded in Container View with Embed segue
Show segue "eleventhToTwelveth" to "Tweleveth View Controller"
Embed segue "myEmbeddedSegue" to "Managed Table"
ManagedTableEleventhViewController contiene 4 celdas estáticas que contienen 1 textField cada una y una celda estática vacía.
import UIKit
import Foundation
protocol DelegateEleventh {
func checkField(sender:EleventhViewController)
}
class EleventhViewController: UIViewController {
var delegate:DelegateEleventh?
@IBAction func nextButton(_ sender: Any) {
//if delegate is not nil, call func checkField
if let delegateVC = delegate {
delegateVC.checkField(sender:self)
} else{
print("delegateVC value \(delegate)") //prints nil
}
}
} //end of class
import Foundation
import UIKit
class ManagedTableEleventhViewController:
UITableViewController,UITextFieldDelegate,DelegateEleventh {
@IBOutlet weak var fullName: UITextField!
@IBOutlet weak var flatNumber: UITextField!
@IBOutlet weak var streetAddress: UITextField!
@IBOutlet weak var phoneNumber: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
}
//When nextButton is touched in EleventhViewController, call this method
func checkField(sender:EleventhViewController){
for cell in self.tableView.visibleCells {
for sub in cell.contentView.subviews{
if sub is UITextField{
let textF = sub as? UITextField
//if textField is empty, make its border red,else clear
if textF?.text == "" {
self.hasText = false
textF?.layer.cornerRadius = 8.0
textF?.layer.masksToBounds = true
textF?.layer.borderColor = UIColor.red.cgColor
textF?.layer.borderWidth = 1.0
} else {
self.hasText = true
//segue to nextViewcontroller
sender.performSegue(withIdentifier: "elevethToTwelveth", sender: sender)
}
}// end of if sub is UITextField
}//end of for sub in cell.contentView
} //end of for cell in tableView
}
//KEYBOARD DOES NOT RESIGN....
// When tapping outside of the keyboard, close the keyboard down
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
// used to check textField has a string value
var hasText:Bool!
//called by ManagedTableEleventhViewController (namely the delegate) when
editing has begun
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField.text == "" {
print("false value in textFieldDidBeginEditing")
self.hasText = false
textField.layer.cornerRadius = 8.0
textField.layer.masksToBounds = true
textField.layer.borderColor = UIColor.red.cgColor
textField.layer.borderWidth = 1.0
} else {
print("true value in textFieldDidBeginEditing")
textField.layer.borderWidth = 1
textField.layer.borderColor = UIColor.white.cgColor
print("call in else")
self.hasText = true
}
}
//called by ManagedTableEleventhViewController (namely the delegate) when
// editing stopped
func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {
//if textField is empty make the border red
if textField.text == "" {
self.hasText = false
textField.layer.cornerRadius = 8.0
textField.layer.masksToBounds = true
textField.layer.borderColor = UIColor.red.cgColor
textField.layer.borderWidth = 1.0
print("false value in textFieldDidEndEditing")
} else {
textField.layer.borderWidth = 1
textField.layer.borderColor = UIColor.white.cgColor
print("true value in textFieldDidEndEditing")
self.hasText = true
}
}
// Stop Editing on Return Key Tap.
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}//end of class