i am doing a form using textfield and textview
after i key in all the information and click the submit button, the app will close and jump to my viewcontroller.swift and show like the below photo
and this is my viewcontroller.swift
import UIKit
import MessageUI
class ContactViewController:UIViewController,MFMailComposeViewControllerDelegate,UITextViewDelegate,UITextFieldDelegate {
#IBOutlet weak var message: UITextView!
#IBOutlet weak var contactSubject: UITextField!
#IBOutlet weak var contactNumber: UITextField!
#IBOutlet weak var contactEmail: UITextField!
#IBOutlet weak var contactName: UITextField!
#IBOutlet weak var contactDes: UILabel!
#IBOutlet weak var contactTitle: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
contactTitle.text = "SEND US A MESSAGES"
contactTitle.sizeToFit()
contactDes.text = "Do you have anything in your mind to tell us?\nPlease don’t hesitate to get in touch to us via our contact form."
contactDes.sizeToFit()
//Contact Form
contactName.delegate = self
contactEmail.delegate = self
contactNumber.delegate = self
contactSubject.delegate = self
message.delegate = self
self.message.isUserInteractionEnabled = true
self.message.isEditable = true
let borderColor : UIColor = UIColor.init(red: 46.0/255.0, green: 49.0/255.0, blue: 146.0/255.0, alpha: 1)
contactName.layer.borderWidth = 1
contactName.layer.borderColor = borderColor.cgColor
contactEmail.layer.borderWidth = 1
contactEmail.layer.borderColor = borderColor.cgColor
contactSubject.layer.borderWidth = 1
contactSubject.layer.borderColor = borderColor.cgColor
contactNumber.layer.borderWidth = 1
contactNumber.layer.borderColor = borderColor.cgColor
message.layer.borderWidth = 1
message.layer.borderColor = borderColor.cgColor
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
contactName.resignFirstResponder()
contactEmail.resignFirstResponder()
contactNumber.resignFirstResponder()
contactSubject.resignFirstResponder()
return true
}
#IBAction func submitbtn(_ sender: Any) {
let mailVC = MFMailComposeViewController()
mailVC.mailComposeDelegate = self
mailVC.setSubject(contactSubject.text!)
let email = contactEmail.text!.lowercased()
let finalemail = email.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
let mailcontent = "Name :\(contactName.text!)\n\n Email:\(finalemail)\n\n Contact Numer :\(contactNumber.text!)\n\n Subject :\(contactSubject.text!)\n\n Message :\(message.text!)"
mailVC.setMessageBody(mailcontent, isHTML: false)
let toRecipent = "abc#example.com"
mailVC.setToRecipients([toRecipent])
self.present(mailVC, animated: true, completion: nil)
}
}
Related
I'm new to swift, I would like to change my UIViewController background color from the custom UIToolbar that I already created at XIB. I also already add the custom toolbar to my keyboard. How can i do that?
In my toolbar, I have a button that indicates the color that the user can set to the background color of UIViewController.
My Custom Toolbar
Class for custom toolbar, ColorToolbar.swift
import UIKit
class ColorToolbar: UIToolbar {
#IBOutlet weak var purpleButton: UIBarButtonItem!
#IBOutlet weak var blueButton: UIBarButtonItem!
#IBOutlet weak var greenButton: UIBarButtonItem!
#IBOutlet weak var yellowButton: UIBarButtonItem!
#IBOutlet weak var redButton: UIBarButtonItem!
var makeNotesVC = MakeNotesVC()
var selectedColor : UIColor = UIColor.clear
override func awakeFromNib() {
super.awakeFromNib()
setupButtonColor()
}
#IBAction func colorButtonPressed(_ sender: UIBarButtonItem) {
guard let color = sender.tintColor else {return}
selectedColor = color
print(selectedColor)
makeNotesVC.view.backgroundColor = selectedColor
}
#objc func changeBgColor(){
makeNotesVC.view.backgroundColor = selectedColor
}
private func setupButtonColor(){
purpleButton.tintColor = Constants.TintColorButton.purple
blueButton.tintColor = Constants.TintColorButton.blue
greenButton.tintColor = Constants.TintColorButton.green
yellowButton.tintColor = Constants.TintColorButton.yellow
redButton.tintColor = Constants.TintColorButton.red
}
}
Class for UIViewController that i want to change background color, MakeNotesVC.swift
import UIKit
class MakeNotesVC: UIViewController {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
#IBOutlet weak var titleTextfield: UITextField!
#IBOutlet weak var notesText: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
addColorbutton()
}
#IBAction func saveButtonPressed(_ sender: UIBarButtonItem) {
let newNote = Note(context: context)
newNote.title = titleTextfield.text
newNote.text = notesText.text
self.navigationController?.popToRootViewController(animated: true)
}
func addColorbutton(){
// TODO : Add Color Options Toolbar
//Register custom toolbar
let toolbar = UINib(nibName: "Toolbar", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! ColorToolbar
toolbar.sizeToFit()
//Add toolbar to keyboard
titleTextfield.inputAccessoryView = toolbar
notesText.inputAccessoryView = toolbar
}
}
Add protocol at your custom tool bar
protocol BackgroundColorControlDelegate: AnyObject {
func changeBackgroundColor(sender:Any, color: UIColor)
}
import UIKit
class ColorToolbar: UIToolbar {
#IBOutlet weak var purpleButton: UIBarButtonItem!
#IBOutlet weak var blueButton: UIBarButtonItem!
#IBOutlet weak var greenButton: UIBarButtonItem!
#IBOutlet weak var yellowButton: UIBarButtonItem!
#IBOutlet weak var redButton: UIBarButtonItem!
var makeNotesVC = MakeNotesVC()
var selectedColor : UIColor = UIColor.clear
weak var delegate: BackgroundColorControlDelegate?
override func awakeFromNib() {
super.awakeFromNib()
setupButtonColor()
}
#IBAction func colorButtonPressed(_ sender: UIBarButtonItem) {
guard let color = sender.tintColor else {return}
selectedColor = color
print(selectedColor)
delegate?.changeBackgroundColor(sender: self, color: color)
}
#objc func changeBgColor(){
makeNotesVC.view.backgroundColor = selectedColor
}
private func setupButtonColor(){
purpleButton.tintColor = Constants.TintColorButton.purple
blueButton.tintColor = Constants.TintColorButton.blue
greenButton.tintColor = Constants.TintColorButton.green
yellowButton.tintColor = Constants.TintColorButton.yellow
redButton.tintColor = Constants.TintColorButton.red
}
}
call delegate from MakeNotesVC
import UIKit
class MakeNotesVC: UIViewController {
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
#IBOutlet weak var titleTextfield: UITextField!
#IBOutlet weak var notesText: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
addColorbutton()
}
#IBAction func saveButtonPressed(_ sender: UIBarButtonItem) {
let newNote = Note(context: context)
newNote.title = titleTextfield.text
newNote.text = notesText.text
self.navigationController?.popToRootViewController(animated: true)
}
func addColorbutton(){
// TODO : Add Color Options Toolbar
//Register custom toolbar
let toolbar = UINib(nibName: "Toolbar", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! ColorToolbar
toolbar.sizeToFit()
toolbar.delegate = self
//Add toolbar to keyboard
titleTextfield.inputAccessoryView = toolbar
notesText.inputAccessoryView = toolbar
}
}
extension MakeNotesVC: BackgroundColorControlDelegate {
func changeBackgroundColor(sender:Any, color: UIColor) {
view.backgroundColor = color
}
}
I am quite new to a programming and I need a help.
I am trying to build a simple calculator. In nutshell: There are two UITextField where the numbers are inserted. There is IBAction (buttonCalculate) that performs the calculation + there is another IBAction (buttonClear) that clears the data inserted into text fields. Upon starting the application both IBAction buttons are disabled. The goal is to enable the IBAction (buttonCalculate) once numbers are inserted. In case the user inserts any other character then numbers a warning message(warrningSign2) needs to appear telling the user that ony numbers are accepted.
Can somebody give a tip / hint how I should proceed?
Thanks!
import UIKit
class ViewController: UIViewController {
#IBOutlet weak var Value: UITextField!
#IBOutlet weak var field1: UITextField!
#IBOutlet weak var field2: UITextField!
#IBOutlet weak var buttonClear: UIButton!
#IBOutlet weak var buttonCalculate: UIButton!
#IBOutlet weak var warrningSign: UITextField!
#IBOutlet weak var warrningSign2: UITextField!
func appLoad () {
buttonClear.isEnabled = false
buttonClear.backgroundColor = .gray
if field1.text == "" || field1.text == "" {
warrningSign.textColor = .red
butonCalculate.isEnabled = false
butonCalculate.backgroundColor = .gray}
}
override func viewDidLoad() {
super.viewDidLoad()
appLoad()
}
#IBAction func calculate(_ sender: Any) {
buttonClear.isEnabled = true
buttonClear.backgroundColor = UIColor(red: 74/255, green: 105/255, blue:187/255, alpha: 1)
Value.text = String(Float(field1.text!)! + Float(field2.text!)!)
}
#IBAction func Clear(_ sender: Any) {
Value.text = "Value"
self.field1.text = nil
self.field2.text = nil
}
}
Make UITextField(field1 and field2) Keyboard type to Number Pad or only acceptable number type.
You can catch the characters sent to a UITextField control by adding the below line:
textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
In textFieldDidChange delegate method you can get the text and validate as per your needs.
I would recommend to update the code like below,
#IBAction func calculate(_ sender: Any) {
calculateAction()
}
private func calculateAction() {
buttonClear.isEnabled = true
buttonClear.backgroundColor = UIColor(red: 74/255, green: 105/255, blue:187/255, alpha: 1)
Value.text = String(Float(field1.text!)! + Float(field2.text!)!)
}
And then call the calculateAction() in textFieldDidChange().
Hi I'm a new swift developer and I'm trying to find a way to load all of my textfields in the background thread then make it go back to the mainthread before a viewcontroller appear.
Because in my viewcontroller I have like almost 20 textfield that need to setup like its style, placeholders and etc.. So it takes quite a while for the viewcontroller to appear when I tapped on the button that handle segue to that vc.
I know that I can use this to do the setup textfields in the background
DispatchQueue.global(qos: .userInteractive).async {
<#code#>
}
however I dont know where to put this code. I tried to put it in the viewDidLoad but that doesnt seem to work.
EDIT: ADD IN MY CODE
import UIKit
import MaterialComponents.MaterialTextFields
class AddNewDataVC: UIViewController {
//Outlet
#IBOutlet weak var scrollView: UIScrollView!
#IBOutlet weak var saveNewDataBtn: UIButton!
#IBOutlet weak var sowInfoInputsStackView: UIStackView!
#IBOutlet weak var giltInfoInputsStackView: UIStackView!
#IBOutlet weak var matingInfoInputsStackView: UIStackView!
#IBOutlet weak var farrowInfoInputsStackView: UIStackView!
#IBOutlet weak var vaccinTable: UITableView!
#IBOutlet weak var pigTypeTextField: PickerTextField!
#IBOutlet weak var genderTextField: PickerTextField!
#IBOutlet weak var chipIDTextField: MDCTextField!
#IBOutlet weak var breedTextField: MDCTextField!
#IBOutlet weak var subBreedTextField: MDCTextField!
#IBOutlet weak var dadIDTextField: MDCTextField!
#IBOutlet weak var momIDTextField: MDCTextField!
#IBOutlet weak var penIDTextField: MDCTextField!
#IBOutlet weak var weightTextField: MDCTextField!
#IBOutlet weak var parityTextField: MDCTextField!
#IBOutlet weak var birthDateTextField: PickerTextField!
#IBOutlet weak var weanDateTextField: PickerTextField!
#IBOutlet weak var arrivalDateTextField: PickerTextField!
#IBOutlet weak var herdEntryDateTextField: PickerTextField!
#IBOutlet weak var startOffDutySowDateTextField: PickerTextField!
#IBOutlet weak var semenFromBoarIDTextField: MDCTextField!
#IBOutlet weak var technicianNameTextField: PickerTextField!
#IBOutlet weak var matingDateTextField: PickerTextField!
#IBOutlet weak var estimateBirthDateTextField: PickerTextField!
#IBOutlet weak var realBirthDateTextField: PickerTextField!
#IBOutlet weak var totalNumberOfNewBornsTextField: MDCTextField!
#IBOutlet weak var totalNumberOfDeadNewBornsTextField: MDCTextField!
#IBOutlet weak var averageWeightOfNewBornsTextField: MDCTextField!
#IBOutlet weak var accoucheurNameTextField: MDCTextField!
#IBOutlet weak var newBornDeathReason1TextField: MDCTextField!
#IBOutlet weak var newBornDeathReason2TextField: MDCTextField!
#IBOutlet weak var newBornDeathReason3TextField: MDCTextField!
#IBOutlet weak var newBornCullReason1TextField: MDCTextField!
#IBOutlet weak var newBornCullReason2TextField: MDCTextField!
#IBOutlet weak var newBornCullReason3TextField: MDCTextField!
//Properties
var pigTypeController: MDCTextInputControllerUnderline?
var genderController: MDCTextInputControllerUnderline?
var chipIDController: MDCTextInputControllerUnderline?
var breedController: MDCTextInputControllerUnderline?
var subBreedController: MDCTextInputControllerUnderline?
var dadIDController: MDCTextInputControllerUnderline?
var momIDController: MDCTextInputControllerUnderline?
var penIDController: MDCTextInputControllerUnderline?
var weightController: MDCTextInputControllerUnderline?
var parityController: MDCTextInputControllerUnderline?
var birthDateController: MDCTextInputControllerUnderline?
var weanDateController: MDCTextInputControllerUnderline?
var arrivalDateController: MDCTextInputControllerUnderline?
var herdEntryDateController: MDCTextInputControllerUnderline?
var startOffDutySowDateController: MDCTextInputControllerUnderline?
var semenFromBoarIDController: MDCTextInputControllerUnderline?
var techicianNameController: MDCTextInputControllerUnderline?
var matingDateController: MDCTextInputControllerUnderline?
var estimateBirthDateController: MDCTextInputControllerUnderline?
var realBirthDateController: MDCTextInputControllerUnderline?
var totalNumberOfNewBornsController: MDCTextInputControllerUnderline?
var totalNumberOfDeadNewBornsController: MDCTextInputControllerUnderline?
var averageWeightOfNewBornsController: MDCTextInputControllerUnderline?
var accoucheurNameController: MDCTextInputControllerUnderline?
var newBornDeathReason1Controller: MDCTextInputControllerUnderline?
var newBornDeathReason2Controller: MDCTextInputControllerUnderline?
var newBornDeathReason3Controller: MDCTextInputControllerUnderline?
var newBornCullReason1Controller: MDCTextInputControllerUnderline?
var newBornCullReason2Controller: MDCTextInputControllerUnderline?
var newBornCullReason3Controller: MDCTextInputControllerUnderline?
var allTextFieldControllers = [MDCTextInputControllerUnderline]()
var injectedVaccinArray = [[String : Any]]()
override func viewDidLoad() {
super.viewDidLoad()
setupTextFields()
registerKeyboardNotifications()
addGestureRecognizer()
vaccinTable.dataSource = self
vaccinTable.delegate = self
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
#IBAction func closeAddNewDataPopupBtnPressed(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
#IBAction func saveNewDataBtnPressed(_ sender: Any) {
}
#IBAction func addVaccinDataBtnPressed(_ sender: UIButton) {
let getDestStoryboard = UIStoryboard(name: "AddNewData", bundle: nil)
let popupVC = getDestStoryboard.instantiateViewController(withIdentifier: "addVaccinDataVC") as! AddVaccinInfoVC
popupVC.popupDelegate = self
self.present(popupVC, animated: true, completion: nil)
}
}
extension AddNewDataVC {
func setupTextFields() {
pigTypeController = MDCTextInputControllerUnderline(textInput: pigTypeTextField)
pigTypeTextField.delegate = self
pigTypeTextField.addData(data: PIG_TYPES_ENUM.allValues)
pigTypeController?.placeholderText = "Loại lợn"
allTextFieldControllers.append(pigTypeController!)
genderController = MDCTextInputControllerUnderline(textInput: genderTextField)
genderTextField.delegate = self
genderTextField.addData(data: GENDERS)
genderController?.placeholderText = "Giới tính"
allTextFieldControllers.append(genderController!)
chipIDController = MDCTextInputControllerUnderline(textInput: chipIDTextField)
chipIDTextField.delegate = self
chipIDController?.placeholderText = "Số chip"
allTextFieldControllers.append(chipIDController!)
breedController = MDCTextInputControllerUnderline(textInput: breedTextField)
breedTextField.delegate = self
breedController?.placeholderText = "Giống"
allTextFieldControllers.append(breedController!)
subBreedController = MDCTextInputControllerUnderline(textInput: subBreedTextField)
subBreedTextField.delegate = self
subBreedController?.placeholderText = "Giống phụ"
allTextFieldControllers.append(subBreedController!)
dadIDController = MDCTextInputControllerUnderline(textInput: dadIDTextField)
dadIDTextField.delegate = self
dadIDController?.placeholderText = "Số chip bố mẹ"
allTextFieldControllers.append(dadIDController!)
momIDController = MDCTextInputControllerUnderline(textInput: momIDTextField)
momIDTextField.delegate = self
momIDController?.placeholderText = "Số chip mẹ"
allTextFieldControllers.append(momIDController!)
penIDController = MDCTextInputControllerUnderline(textInput: penIDTextField)
penIDTextField.delegate = self
penIDController?.placeholderText = "Số chuồng"
allTextFieldControllers.append(penIDController!)
weightController = MDCTextInputControllerUnderline(textInput: weightTextField)
weightTextField.delegate = self
weightController?.placeholderText = "Số kg"
allTextFieldControllers.append(weightController!)
parityController = MDCTextInputControllerUnderline(textInput: parityTextField)
parityTextField.delegate = self
parityController?.placeholderText = "Số lứa"
allTextFieldControllers.append(parityController!)
birthDateController = MDCTextInputControllerUnderline(textInput: birthDateTextField)
birthDateTextField.delegate = self
birthDateController?.placeholderText = "Ngày sinh"
allTextFieldControllers.append(birthDateController!)
weanDateController = MDCTextInputControllerUnderline(textInput: weanDateTextField)
weanDateTextField.delegate = self
weanDateController?.placeholderText = "Ngày cai sữa"
allTextFieldControllers.append(weanDateController!)
arrivalDateController = MDCTextInputControllerUnderline(textInput: arrivalDateTextField)
arrivalDateTextField.delegate = self
arrivalDateController?.placeholderText = "Ngày đến"
allTextFieldControllers.append(arrivalDateController!)
herdEntryDateController = MDCTextInputControllerUnderline(textInput: herdEntryDateTextField)
herdEntryDateTextField.delegate = self
herdEntryDateController?.placeholderText = "Ngày nhập đàn"
allTextFieldControllers.append(herdEntryDateController!)
startOffDutySowDateController = MDCTextInputControllerUnderline(textInput: startOffDutySowDateTextField)
startOffDutySowDateTextField.delegate = self
startOffDutySowDateController?.placeholderText = "Ngày nái nghỉ"
allTextFieldControllers.append(startOffDutySowDateController!)
semenFromBoarIDController = MDCTextInputControllerUnderline(textInput: semenFromBoarIDTextField)
semenFromBoarIDTextField.delegate = self
semenFromBoarIDController?.placeholderText = "Mã heo nọc"
allTextFieldControllers.append(semenFromBoarIDController!)
techicianNameController = MDCTextInputControllerUnderline(textInput: technicianNameTextField)
technicianNameTextField.delegate = self
techicianNameController?.placeholderText = "Người phối"
technicianNameTextField.addData(data: TECHNICIAN_NAMES)
allTextFieldControllers.append(techicianNameController!)
matingDateController = MDCTextInputControllerUnderline(textInput: matingDateTextField)
matingDateTextField.delegate = self
matingDateController?.placeholderText = "Ngày phối"
allTextFieldControllers.append(matingDateController!)
estimateBirthDateController = MDCTextInputControllerUnderline(textInput: estimateBirthDateTextField)
estimateBirthDateTextField.delegate = self
estimateBirthDateController?.placeholderText = "Ngày đẻ dự kiến"
allTextFieldControllers.append(estimateBirthDateController!)
realBirthDateController = MDCTextInputControllerUnderline(textInput: realBirthDateTextField)
realBirthDateTextField.delegate = self
realBirthDateController?.placeholderText = "Ngày đẻ thực tế"
allTextFieldControllers.append(realBirthDateController!)
totalNumberOfNewBornsController = MDCTextInputControllerUnderline(textInput: totalNumberOfNewBornsTextField)
totalNumberOfNewBornsTextField.delegate = self
totalNumberOfNewBornsController?.placeholderText = "Tổng heo con sinh"
allTextFieldControllers.append(totalNumberOfNewBornsController!)
totalNumberOfDeadNewBornsController = MDCTextInputControllerUnderline(textInput: totalNumberOfDeadNewBornsTextField)
totalNumberOfDeadNewBornsTextField.delegate = self
totalNumberOfDeadNewBornsController?.placeholderText = "Tổng heo con chết"
allTextFieldControllers.append(totalNumberOfDeadNewBornsController!)
averageWeightOfNewBornsController = MDCTextInputControllerUnderline(textInput: averageWeightOfNewBornsTextField)
averageWeightOfNewBornsTextField.delegate = self
averageWeightOfNewBornsController?.placeholderText = "Kg trung bình"
allTextFieldControllers.append(averageWeightOfNewBornsController!)
accoucheurNameController = MDCTextInputControllerUnderline(textInput: accoucheurNameTextField)
accoucheurNameTextField.delegate = self
accoucheurNameController?.placeholderText = "Người đỡ đẻ"
allTextFieldControllers.append(accoucheurNameController!)
newBornDeathReason1Controller = MDCTextInputControllerUnderline(textInput: newBornDeathReason1TextField)
newBornDeathReason1TextField.delegate = self
newBornDeathReason1Controller?.placeholderText = "Chết khô"
allTextFieldControllers.append(newBornDeathReason1Controller!)
newBornDeathReason2Controller = MDCTextInputControllerUnderline(textInput: newBornDeathReason2TextField)
newBornDeathReason2TextField.delegate = self
newBornDeathReason2Controller?.placeholderText = "Chết lưu"
allTextFieldControllers.append(newBornDeathReason2Controller!)
newBornDeathReason3Controller = MDCTextInputControllerUnderline(textInput: newBornDeathReason3TextField)
newBornDeathReason3TextField.delegate = self
newBornDeathReason3Controller?.placeholderText = "Chết tươi"
allTextFieldControllers.append(newBornDeathReason3Controller!)
newBornCullReason1Controller = MDCTextInputControllerUnderline(textInput: newBornCullReason1TextField)
newBornCullReason1TextField.delegate = self
newBornCullReason1Controller?.placeholderText = "Loại nhỏ"
allTextFieldControllers.append(newBornCullReason1Controller!)
newBornCullReason2Controller = MDCTextInputControllerUnderline(textInput: newBornCullReason2TextField)
newBornCullReason2TextField.delegate = self
newBornCullReason2Controller?.placeholderText = "Loại yếu"
allTextFieldControllers.append(newBornCullReason2Controller!)
newBornCullReason3Controller = MDCTextInputControllerUnderline(textInput: newBornCullReason3TextField)
newBornCullReason3TextField.delegate = self
newBornCullReason3Controller?.placeholderText = "Loại nhỏ"
allTextFieldControllers.append(newBornCullReason3Controller!)
for controller in allTextFieldControllers {
controller.activeColor = Theme.darkAccent
controller.floatingPlaceholderActiveColor = Theme.darkAccent
}
}
func addGestureRecognizer() {
let tapRecognizer = UITapGestureRecognizer(target: self,
action: #selector(tapDidTouch(sender: )))
self.scrollView.addGestureRecognizer(tapRecognizer)
}
#objc func tapDidTouch(sender: Any) {
self.view.endEditing(true)
}
func registerKeyboardNotifications() {
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillShow(notif:)),
name: .UIKeyboardWillChangeFrame,
object: nil)
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillShow(notif:)),
name: .UIKeyboardWillShow,
object: nil)
notificationCenter.addObserver(
self,
selector: #selector(keyboardWillHide(notif:)),
name: .UIKeyboardWillHide,
object: nil)
}
#objc func keyboardWillShow(notif: Notification) {
guard let frame = notif.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect else {
return
}
scrollView.contentInset = UIEdgeInsets(top: 0.0,
left: 0.0,
bottom: frame.height,
right: 0.0)
}
#objc func keyboardWillHide(notif: Notification) {
scrollView.contentInset = UIEdgeInsets()
}
func toggleFarrowInfoInputsStackView(toggle: Bool) {
if toggle {
sowInfoInputsStackView.isHidden = false
} else {
sowInfoInputsStackView.isHidden = true
}
}
func toggleGiltInputs(toggle: Bool) {
if toggle {
giltInfoInputsStackView.isHidden = false
} else {
giltInfoInputsStackView.isHidden = true
}
}
func toggleOffDutySowInputs(toggle: Bool) {
if toggle {
startOffDutySowDateTextField.isHidden = false
} else {
startOffDutySowDateTextField.isHidden = true
}
}
func toggleMatingInputs(toggle: Bool) {
if toggle {
matingInfoInputsStackView.isHidden = false
} else {
matingInfoInputsStackView.isHidden = true
}
}
func toggleFarrowInputs(toggle: Bool) {
if toggle {
farrowInfoInputsStackView.isHidden = false
} else {
farrowInfoInputsStackView.isHidden = true
}
}
func toggleParityTextField(toggle: Bool) {
if toggle {
parityTextField.isHidden = false
} else {
parityTextField.isHidden = true
}
}
}
extension AddNewDataVC: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
return false
}
func textFieldDidEndEditing(_ textField: UITextField) {
if let textField = textField as? PickerTextField {
let text = textField.text?.lowercased()
if !textField.isDatePicker && textField == pigTypeTextField {
if text!.contains("nái") || textField.text! == PIG_TYPES_ENUM.gilt.rawValue {
toggleFarrowInfoInputsStackView(toggle: true)
if textField.text! == PIG_TYPES_ENUM.gilt.rawValue {
toggleGiltInputs(toggle: true)
toggleOffDutySowInputs(toggle: false)
toggleMatingInputs(toggle: false)
toggleFarrowInputs(toggle: false)
} else if textField.text! == PIG_TYPES_ENUM.offDutySow.rawValue {
toggleGiltInputs(toggle: true)
toggleOffDutySowInputs(toggle: true)
toggleMatingInputs(toggle: false)
toggleFarrowInputs(toggle: false)
} else if textField.text! == PIG_TYPES_ENUM.matingSow.rawValue {
toggleGiltInputs(toggle: true)
toggleOffDutySowInputs(toggle: false)
toggleMatingInputs(toggle: true)
toggleFarrowInputs(toggle: false)
} else if textField.text! == PIG_TYPES_ENUM.farrow.rawValue {
toggleGiltInputs(toggle: true)
toggleOffDutySowInputs(toggle: false)
toggleMatingInputs(toggle: true)
toggleFarrowInputs(toggle: true)
}
} else {
toggleFarrowInfoInputsStackView(toggle: false)
toggleGiltInputs(toggle: false)
toggleOffDutySowInputs(toggle: false)
toggleMatingInputs(toggle: false)
toggleFarrowInputs(toggle: false)
if textField.text! == PIG_TYPES_ENUM.boar.rawValue {
genderTextField.text = "Đực"
genderTextField.isUserInteractionEnabled = false
} else {
genderTextField.text = ""
genderTextField.isUserInteractionEnabled = true
}
}
} else if !textField.isDatePicker && textField == genderTextField {
if textField.text == "Cái" {
toggleParityTextField(toggle: true)
} else {
toggleParityTextField(toggle: false)
}
}
}
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField is PickerTextField {
textField.resignFirstResponder()
return false
} else {
return true
}
}
}
extension AddNewDataVC: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return injectedVaccinArray.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = vaccinTable.dequeueReusableCell(withIdentifier: "injectedVaccinCell", for: indexPath) as? InjectedVaccinCell else {
return UITableViewCell()
}
cell.configureCell(value: injectedVaccinArray[indexPath.row])
return cell
}
}
extension AddNewDataVC: PopupDelegates {
func popupValueSelected(value: [String : Any]) {
self.injectedVaccinArray.append(value)
self.vaccinTable.reloadData()
}
}
There are alot of room for improvement I know but I'm just learned swift so sorry if my code make you itch haha. right now I'm just focusing on make it works and will try to clean it up later down the road.
I am having some problems with function textFieldShouldReturn as far at i understand it should be called when enter are pressed on the keyboard but it does not. I have tried to search for solution on google and here but have not found a answer that solved the problem because most of the answers here on the webpage i have fund are a 3 years or older and the solutions from those did not help much.
I am using it in a UIView where the delegates for the textField is set in the function awakeFromNib() and i have tried some other delegate function textViewDidChangeSelection that does work so i am at a lost why it is not working.
Here is how the xib file looks
Here is the code that i am using as a popup:
import UIKit
class CuePointPopup: UIView,UITextFieldDelegate,UITextViewDelegate
{
#IBOutlet var labelCueNumberInImage: UILabel!
#IBOutlet var labelCueNumber: UILabel!
#IBOutlet var labelLayerName: UILabel!
#IBOutlet var labelPageNumber: UILabel!
#IBOutlet weak var view: UIImageView!
#IBOutlet var textFieldWhoText: UITextField!
#IBOutlet var textViewWhatText: UITextView!
#IBOutlet var textFieldWhereText: UITextField!
#IBOutlet var textFieldPageNumber: UITextField!
#IBOutlet var textFieldCueText: UITextField!
#IBOutlet var boxArrowLeft: UIImageView!
#IBOutlet var boxArrowRight: UIImageView!
#IBOutlet var boxArrowLeftTopConstraint: NSLayoutConstraint!
#IBOutlet var boxArrowRightTopConstraint: NSLayoutConstraint!
var cuePointObj:CuePoint!
var blockBtnClickedSave:((CuePoint) -> ())!
var blockBtnClickedCancel:((CuePoint) -> ())!
var blockBtnClickedDelete:((CuePoint) -> ())!
var blockTextChangedForPageNumber:((String, CuePoint) -> ())!
#IBOutlet var btnOutletVisibleOnPage: UIButton!
var isVisible = false
class func loadNib() -> CuePointPopup
{
return Bundle.main.loadNibNamed("CuePointPopup", owner: self,options: nil)!.last as! CuePointPopup
}
override func awakeFromNib() {
self.textFieldWhoText.delegate = self
self.textViewWhatText.delegate = self
self.textFieldWhereText.delegate = self
self.textFieldCueText.delegate = self
textViewWhatText.text = "Hello"
}
func setViewData(cueModel:CuePoint) {
self.cuePointObj = cueModel
labelCueNumberInImage.text = cueModel.cueNumber
labelCueNumber.text = "Cue #:" + cueModel.cueNumber
labelLayerName.text = "Layer #:" + cueModel.layerName
labelPageNumber.text = "Page #:" + cueModel.pageNumber
textFieldPageNumber.text = cueModel.pageNumber
textFieldWhoText.text = cueModel.whoString
textViewWhatText.text = cueModel.whatString
textFieldWhereText.text = cueModel.whereString
textFieldCueText.text = cueModel.cueTextString
if cueModel.isVisibleOnPage == true {
btnOutletVisibleOnPage.setImage(UIImage(named: "SelectedBox"), for: [])
btnOutletVisibleOnPage.tag = 1
}else{
btnOutletVisibleOnPage.setImage(UIImage(named: "UnselectedBox"), for: [])
btnOutletVisibleOnPage.tag = 0
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
if textField.text != "" {
if blockTextChangedForPageNumber != nil {
self.blockTextChangedForPageNumber(textField.text!, self.cuePointObj)
}
}
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
//self.view.endEditing(true)
if self.textFieldWhoText.isEditing {
self.textFieldWhoText.endEditing(true)
} else if self.textFieldCueText.isEditing{
self.textFieldCueText.endEditing(true)
} else if self.textFieldWhereText.isEditing {
self.textFieldWhereText.endEditing(true)
} else {
self.textViewWhatText.endEditing(true)
}
//self.view.endEditing(true)
return false
}
}
Here is how i load the XIB
#IBOutlet weak var bookView: UIView!
var objCuePopup:CuePointPopup!
if objCuePopup != nil {
objCuePopup.removeFromSuperview()
}
objCuePopup = CuePointPopup.loadNib()
objCuePopup = CuePointPopup.loadNib()
objCuePopup.frame = CGRect(x:cuePointModal.cueX, y:0, width:465, height:410)
objCuePopup.center = CGPoint(x:objCuePopup.center.x, y:cuePointModal.cueY + 5)
//Set Y value for Popup View
if objCuePopup.frame.origin.y < bookView.frame.origin.y {
objCuePopup.frame.origin.y = bookView.frame.origin.y
}
let popupMaxY = objCuePopup.frame.maxY
let bookViewMaxY = bookView.frame.maxY
if popupMaxY > bookViewMaxY {
objCuePopup.frame.origin.y = bookViewMaxY - objCuePopup.frame.size.height
}
//Set X value for Popup View
if cuePointModal.cueX > 455 {
objCuePopup.frame.origin.x = cuePointModal.cueX - 455
objCuePopup.boxArrowLeft.isHidden = true
objCuePopup.boxArrowRight.isHidden = false
let rightY = cuePointModal.cueY - objCuePopup.frame.origin.y
objCuePopup.boxArrowRightTopConstraint.constant = rightY + 3
}else{
objCuePopup.frame.origin.x = cuePointModal.cueX + 40
objCuePopup.boxArrowLeft.isHidden = false
objCuePopup.boxArrowRight.isHidden = true
let leftY = cuePointModal.cueY - objCuePopup.frame.origin.y
objCuePopup.boxArrowLeftTopConstraint.constant = leftY + 3
}
objCuePopup.setViewData(cueModel: cuePointModal)
objCuePopup.textFieldWhoText.delegate = self
objCuePopup.textFieldWhereText.delegate = self
objCuePopup.textViewWhatText.delegate = self
objCuePopup.textFieldCueText.delegate = self
bookView.addSubview(objCuePopup)
I hope that someone here can help me with this problem.
I'm having a Sign up View controller in storyboard and it keeps showing me the same error in console:
this class is not key value coding-compliant for the key displayNameTextField.
I'm aware that this means that there's a connection that no longer exists and it causing it to crash. The problem is that I don't see any issues whatsoever. This is the View controller in Storyboard along with all the connections:
This is the code:
class SignUpVC: UIViewController
{
#IBOutlet weak var displayNameTextField: UITextField!
#IBOutlet weak var usernameTextField: UITextField!
#IBOutlet weak var emailTextField: UITextField!
#IBOutlet weak var passwordTextField: UITextField!
#IBOutlet weak var registerButton: UIButton!
override func viewDidLoad()
{
super.viewDidLoad()
setupTextFields()
}
func setupTextFields()
{
displayNameTextField.tintColor = UIColor.white
displayNameTextField.textColor = UIColor.white
displayNameTextField.backgroundColor = UIColor(red: 138/255, green: 82/255, blue: 108/255, alpha: 1.0)
displayNameTextField.attributedPlaceholder = NSAttributedString(string : displayNameTextField.placeholder!,
attributes: [NSAttributedStringKey.foregroundColor : UIColor(white: 1.0, alpha: 0.6)])
handleTextFields()
}
func handleTextFields()
{
displayNameTextField.addTarget(self, action: #selector(self.textFieldDidChange), for: .editingChanged)
}
#objc func textFieldDidChange() {
guard let username = usernameTextField.text, !username.isEmpty,
let displayName = displayNameTextField.text, !displayName.isEmpty,
let email = emailTextField.text, !email.isEmpty,
let password = passwordTextField.text, !password.isEmpty
else
{
return
}
registerButton.isEnabled = true
}
}
What am I doing wrong? It's one of those cases where this should be painfully obvious but I just don't see it.
This error is usually an indication that you haven’t set the subclass of the view controller correctly.
Check in the attributes inspector in interface builder for that view controller.