// // RecipientFormViewController.swift // GMERemittance // // Created by Fm-user on 12/22/17. // Copyright © 2017 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit import SDWebImage protocol PaginationDelegate { func updateCurrentIndex(status:String,recipient: Recipient,pageNumber: Int) } class RecipientFormViewController: UIViewController { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var textFieldFirstName: UITextField! @IBOutlet weak var textFieldMiddleName: UITextField! @IBOutlet weak var textFieldLastName: UITextField! @IBOutlet weak var textFieldCountry: UITextField! @IBOutlet weak var textFieldState: UITextField! @IBOutlet weak var textFieldDistrict: UITextField! @IBOutlet weak var textFieldCity: UITextField! @IBOutlet weak var textFieldAddress: UITextField! @IBOutlet weak var textFieldRelation: UITextField! @IBOutlet weak var textFieldMobile: UITextField! @IBOutlet weak var textFieldEmail: UITextField! @IBOutlet weak var textFieldTransferReason: UITextField! private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() private var pickerView = UIPickerView() private var arrayOftextFields: [UITextField]! private var activeTextField: UITextField? private var selectedIndexFor: [String: Int] = [String: Int]() public var paginationDelegate: PaginationDelegate! private var recipientviewmodel: RecipientViewModel! private var createNewRecipient: Bool! var noInternetDialog: Bool? var pageNumber: Int? var recipient: Recipient? var newRecipient: Recipient? var pickerData: [String] = [String]() var pickerDataState: [String] = [String]() var pickerDataDistrict: [String] = [String]() var pickerDataRelation: [String] = [String]() var pickerDataReason: [String] = [String]() var countryResult = false var stateResult = false var districtResult = false var relationResult = false var trasferReasonResult = false private var updateParameters: [String: String] = [String: String] () public static var recipientConnectionTimeOutConnectionCheck = 0 var pickerIndex: Int = 0 func createRecipientObject(recipientId: String) -> Recipient{ var recipient = Recipient() recipient.recipientId = recipientId recipient.firstName = textFieldFirstName.text recipient.middleName = textFieldMiddleName.text recipient.lastName = textFieldLastName.text recipient.city = textFieldCity.text recipient.address = textFieldAddress.text recipient.mobileNumber = textFieldMobile.text recipient.email = textFieldEmail.text if createNewRecipient! { if let index = selectedIndexFor["country"]{ if recipientviewmodel.getCountryId(index: index) != "N/A"{ recipient.country = recipientviewmodel.getCountryId(index: index) } } if let index = selectedIndexFor["relation"]{ recipient.relation = recipientviewmodel.getRelationValue(index: index) } if let index = selectedIndexFor["transferReason"]{ recipient.reason = recipientviewmodel.getTransferReasonValue(index: index) } if let index = selectedIndexFor["state"]{ recipient.state = recipientviewmodel.getStateValue(index: index) } if let index = selectedIndexFor["district"]{ recipient.district = recipientviewmodel.getDistrictValue(index: index) } } else { if let index = selectedIndexFor["country"]{ recipient.country = recipientviewmodel.getCountryName(index: index) } if let index = selectedIndexFor["country"]{ recipient.countryId = recipientviewmodel.getCountryId(index: index) } if let index = selectedIndexFor["relation"]{ recipient.relationId = recipientviewmodel.getRelationValue(index: index) } if let index = selectedIndexFor["relation"]{ recipient.relation = recipientviewmodel.getRelationName(index: index) } if let index = selectedIndexFor["transferReason"]{ recipient.reasonId = recipientviewmodel.getTransferReasonValue(index: index) } if let index = selectedIndexFor["transferReason"]{ recipient.reason = recipientviewmodel.getTransferReasonName(index: index) } if let index = selectedIndexFor["state"]{ recipient.state = recipientviewmodel.getState(index: index) } if let index = selectedIndexFor["state"]{ recipient.stateId = recipientviewmodel.getStateValue(index: index) } if let index = selectedIndexFor["district"]{ recipient.district = recipientviewmodel.getDistrict(index: index) } if let index = selectedIndexFor["district"]{ recipient.districtId = recipientviewmodel.getDistrictValue(index: index) } } return recipient } @IBAction func createOrUpdateRecipient(_ sender: Any) { startLoading() let textFieldArray = [textFieldFirstName.text, textFieldLastName.text, textFieldCountry.text, textFieldState.text, textFieldDistrict.text, textFieldCity.text, textFieldAddress.text, textFieldRelation.text, textFieldMobile.text, textFieldTransferReason.text] guard recipientviewmodel.allFieldsFilled(arrayofInfo: textFieldArray as! [String]) else { self.popUpMessageError(value: 11, message: "Please fill all the fields") stopLoading() return } if createNewRecipient { recipientviewmodel.createRecipient() } else { recipientviewmodel.updateRecipient(recipientId: (recipient?.recipientId)!, updateParams: updateParameters) } activeTextField?.resignFirstResponder() } func setPageNumber(pageNumber: Int){ self.pageNumber = pageNumber; } @objc func clearKeyboard() { activeTextField?.resignFirstResponder() } override func viewDidLoad() { super.viewDidLoad() selectedIndexFor["country"] = 0 selectedIndexFor["transferReason"] = 0 selectedIndexFor["relation"] = 0 selectedIndexFor["state"] = 0 selectedIndexFor["district"] = 0 setUpNavBar(id: 201, title: "Send Money") noInternetDialog = false startLoading() /// TODO: first transaction free message Display /* tracktransactionviewmodel.internetConnection.value = nil tracktransactionviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.popUpMessage(value: 15) } tracktransactionviewmodel.fetchTransactionList(recipientId: "", recipientName: "", transactionType: "", startDate: "", endDate: "") tracktransactionviewmodel.transactionListObtained.bind{ [unowned self] in guard $0 != nil else { return } self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() guard $0! else { self.popUpMessageError(value: 10, message: self.tracktransactionviewmodel.getErrorMessage()) return } let appDelegate = UIApplication.shared.delegate as! AppDelegate let transactionStatus = appDelegate.firstTranscationStatusForProfileForm if self.tracktransactionviewmodel.getCount() == 0 && transactionStatus == true { self.popUpMessage(value: 9) } }*/ RecipientListViewController.recipientStatus = false NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) arrayOftextFields = [textFieldFirstName, textFieldMiddleName, textFieldLastName, textFieldCountry, textFieldState, textFieldDistrict, textFieldCity, textFieldAddress, textFieldRelation, textFieldMobile, textFieldEmail, textFieldTransferReason] for textField in arrayOftextFields { textField.delegate = self } pickerView.delegate = self pickerView.dataSource = self guard recipient == nil else { createNewRecipient = false recipientviewmodel = RecipientViewModel(recipient: recipient!) setUpAnotherLoginListener(genericviewmodel: recipientviewmodel) if let firstName = recipient?.firstName{ textFieldFirstName.text = firstName } if let middleName = recipient?.middleName{ textFieldMiddleName.text = middleName } if let lastName = recipient?.lastName{ textFieldLastName.text = lastName } if let district = recipient?.district{ textFieldDistrict.text = district } if let city = recipient?.city{ textFieldCity.text = city } if let state = recipient?.state{ textFieldState.text = state } if let address = recipient?.address{ textFieldAddress.text = address } if let mobileNumber = recipient!.mobileNumber{ textFieldMobile.text = mobileNumber } if let email = recipient?.email{ textFieldEmail.text = email } if let relation = recipient?.relation{ textFieldRelation.text = relation } if let reason = recipient?.reason{ textFieldTransferReason.text = reason } recipientviewmodel.recipientConnectionTimeOut.value = nil /** connection timeout */ recipientviewmodel.recipientConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if RecipientFormViewController.recipientConnectionTimeOutConnectionCheck == 0{ RecipientFormViewController.recipientConnectionTimeOutConnectionCheck = RecipientFormViewController.recipientConnectionTimeOutConnectionCheck+1 self.popUpMessage(value: 27) self.textFieldCountry.text = "" self.textFieldCountry.leftViewMode = UITextFieldViewMode.never } } self.startLoading() internetCheck() self.setUpListener() self.cddListBindCall() fetchCountryList() recipientviewmodel.fetchCDDListFor(cddName: cddCode.Province.rawValue, param: ["countryId": (recipient?.countryId)!]) if let stateId = recipient?.stateId { recipientviewmodel.fetchCDDListFor(cddName: cddCode.District.rawValue, param: [ "countryId": (recipient?.countryId)!, "provinceId": stateId]) } fetchRelationList() fetchTransferReason() return } createNewRecipient = true recipientviewmodel = RecipientViewModel() recipientviewmodel.recipientConnectionTimeOut.value = nil /** connection timeout */ recipientviewmodel.recipientConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() if RecipientFormViewController.recipientConnectionTimeOutConnectionCheck == 0{ RecipientFormViewController.recipientConnectionTimeOutConnectionCheck = RecipientFormViewController.recipientConnectionTimeOutConnectionCheck+1 self.popUpMessage(value: 27) self.textFieldCountry.text = "" self.textFieldCountry.leftViewMode = UITextFieldViewMode.never } } setUpAnotherLoginListener(genericviewmodel: recipientviewmodel) internetCheck() self.setUpListener() cddListBindCall() fetchCountryList() fetchTransferReason() fetchRelationList() } /** Api request to fetch list of country */ func fetchCountryList(){ if recipientviewmodel.getCountryList().count == 0 { recipientviewmodel.fetchListOfCountry() } } /** Api request to fetch transfer reason */ func fetchTransferReason() { if recipientviewmodel.getTransferReason().count == 0 { recipientviewmodel.fetchCDDListFor(cddName: cddCode.TransferReason.rawValue, param: ["": ""]) } } /** Api request to fetch states */ func fetchStates() { recipientviewmodel.fetchCDDListFor(cddName: cddCode.Province.rawValue, param: ["countryId": recipientviewmodel.getCountryId(index: selectedIndexFor["country"]!)]) } /** Api request to fetch district */ func fetchDistrict() { recipientviewmodel.fetchCDDListFor(cddName: cddCode.District.rawValue, param: [ "countryId": recipientviewmodel.getCountryId(index: selectedIndexFor["country"]!), "provinceId": recipientviewmodel.getStateValue(index: selectedIndexFor["state"]!)]) } /** Api request to fetch list of relation */ func fetchRelationList() { if recipientviewmodel.getRelationList().count == 0 { recipientviewmodel.fetchCDDListFor(cddName: cddCode.Relation.rawValue, param: ["": ""]) } } override func viewDidDisappear(_ animated: Bool) { RecipientListViewController.recipientStatus = false } /** Check internet connection */ func internetCheck(){ recipientviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } if !self.noInternetDialog! { self.stopLoading() self.popUpMessage(value: 15) self.textFieldCountry.text = "" self.textFieldCountry.leftViewMode = UITextFieldViewMode.never } self.stopLoading() self.noInternetDialog = true } } /** bind call for recipient both create and update */ func setUpListener() { recipientviewmodel.recipientCreatedUpdated.bind { [unowned self] in guard $0 != nil else { return } guard $0! else { //self.popUpMessageError(value: 10, message: self.recipientviewmodel.getErrorMessage()) self.stopLoading() return } if self.createNewRecipient { self.newRecipient = self.recipientviewmodel.getCreatedRecipient() self.addRecipient() } else { self.recipientUpdateMessage() } } /** bind call for country list */ recipientviewmodel.cddCountryListAvailable.bind { [weak self] in guard $0 != nil else { return } guard $0! else { // self?.popUpMessageError(value: 10, message: (self?.recipientviewmodel.getErrorMessage())!) return } if self?.recipient != nil { self?.pickerData = (self?.recipientviewmodel.getCountryNameList())! if let countryId = self?.recipient?.countryId{ let countryIndex = self?.recipientviewmodel.getIndex(id: countryId) if let url = self?.recipientviewmodel.getCountryFlagUrlList()[countryIndex!]{ let url = url self?.selectedIndexFor["country"] = countryIndex self?.showCountryWithFlag(textField: (self?.textFieldCountry)!, url: url, index: countryIndex!) } } } self?.countryResult = true if (self?.createNewRecipient)! { self?.stopLoading() } else { self?.checkResult() } } } /** bind call for cddList - Transfer reason - relation - Province - District */ func cddListBindCall(){ recipientviewmodel.cddListAvailable.bind { [weak self] in guard $0 != nil else { return } guard $0! != 0 else { // self?.popUpMessageError(value: 10, message: (self?.recipientviewmodel.getErrorMessage())!) return } self?.pickerDataRelation = (self?.recipientviewmodel.getRelationList())! self?.pickerDataReason = (self?.recipientviewmodel.getTransferReason())! if !(self?.createNewRecipient)! { switch $0!{ case 1: self?.pickerDataReason = (self?.recipientviewmodel.getTransferReason())! if self?.textFieldTransferReason.text != ""{ if let reasonIndex = self?.pickerDataReason.index(of: (self?.textFieldTransferReason.text)!) { self?.selectedIndexFor["transferReason"] = reasonIndex } } self?.trasferReasonResult = true case 2: self?.pickerDataState = (self?.recipientviewmodel.getStateList())! if self?.textFieldState.text != "" { if let stateIndex = self?.pickerDataState.index(of: (self?.textFieldState.text)!){ self?.selectedIndexFor["state"] = stateIndex } } else { self?.selectedIndexFor["state"] = 0 } self?.stateResult = true case 3: self?.pickerDataDistrict = (self?.recipientviewmodel.getDistrictList())! if self?.textFieldDistrict.text != ""{ if let districtIndex = self?.pickerDataDistrict.index(of: (self?.textFieldDistrict.text)!) { self?.selectedIndexFor["district"] = districtIndex } } else { self?.selectedIndexFor["district"] = 0 } self?.districtResult = true case 4: self?.pickerDataRelation = (self?.recipientviewmodel.getRelationList())! self?.selectedIndexFor["relation"] = self?.pickerDataRelation.index(of: (self?.textFieldRelation.text)!) self?.relationResult = true default: return } } if (self?.createNewRecipient)! { self?.stopLoading() } else { self?.checkResult() } self?.recipientviewmodel.cddListAvailable.value = nil } } /** To check all result are available or not after multiple api call.. */ func checkResult(){ if countryResult == true && stateResult == true && districtResult == true && relationResult == true && trasferReasonResult == true { stopLoading() } } /** Disable user interaction while fetching data from api */ func startLoading(){ disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) } /** Enable user interaction while fetching data from api */ func stopLoading(){ self.dismissActivityIndicator(activityIndicator: self.activityIndicator) self.enableUserInteractions() } func addRecipient(){ let alert = UIAlertController(title:"Add", message:"New Receiver profile added successfully" , preferredStyle: .actionSheet) present(alert, animated: true, completion: nil) let when = DispatchTime.now() + 2 DispatchQueue.main.asyncAfter(deadline: when){ alert.dismiss(animated: true, completion: nil) if let recipientId = self.self.recipientviewmodel.getCreatedRecipient().recipientId, let pageNumber = self.pageNumber{ self.paginationDelegate.updateCurrentIndex(status: "add",recipient: self.createRecipientObject(recipientId:recipientId),pageNumber: pageNumber) } self.navigationController?.popViewController(animated: true) } } func recipientUpdateMessage(){ let alert = UIAlertController(title:"Update", message:"Receiver profile updated successfully" , preferredStyle: .actionSheet) present(alert, animated: true, completion: nil) let when = DispatchTime.now() + 2 DispatchQueue.main.asyncAfter(deadline: when){ // your code with delay alert.dismiss(animated: true, completion: nil) if let recipientId = self.recipient?.recipientId , let pageNumber = self.pageNumber{ self.paginationDelegate.updateCurrentIndex(status: "update",recipient: self.createRecipientObject(recipientId: (recipientId)),pageNumber: pageNumber) } self.navigationController?.popViewController(animated: true) } } @objc func keyboardWillShow(notification: NSNotification) { var userInfo = notification.userInfo! var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue keyboardFrame = self.view.convert(keyboardFrame, from: nil) var contentInset:UIEdgeInsets = self.scrollView.contentInset contentInset.bottom = keyboardFrame.size.height + 70 self.scrollView.contentInset = contentInset } @objc func keyboardWillHide(notification: NSNotification) { self.scrollView.contentInset = UIEdgeInsets.zero } //Doing Picker view button func pickUp(_ textField : UITextField){ // UIPickerView self.pickerView = UIPickerView(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216)) self.pickerView.delegate = self self.pickerView.dataSource = self //self.pickerView.backgroundColor = UIColor.white textField.inputView = self.pickerView // ToolBar let toolBar = UIToolbar() toolBar.barStyle = .default toolBar.isTranslucent = true toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1) toolBar.sizeToFit() // Adding Button ToolBar let customButton = UIButton() var cancel = UIBarButtonItem() customButton.setTitle("Done", for: .normal) customButton.addTarget(self, action: #selector(doneClick), for: .touchUpInside) customButton.setTitleColor(UIColor(hex : 0xED1C24), for: .normal) customButton.frame = CGRect(x: 0, y: 0, width: 60, height: 30) cancel = UIBarButtonItem(title: "Cancel", style: .done, target: self, action: #selector(self.cancelClick)) cancel.tintColor = UIColor.black let doneButton = UIBarButtonItem(customView: customButton) let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) toolBar.setItems([cancel,spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true textField.inputAccessoryView = toolBar } @objc func doneClick() { activeTextField?.resignFirstResponder() self.noInternetDialog = false if activeTextField == textFieldCountry { textFieldState.text = "" textFieldDistrict.text = "" pickerDataState.removeAll() pickerDataDistrict.removeAll() selectedIndexFor["state"] = 0 selectedIndexFor["country"] = pickerIndex startLoading() if let index = selectedIndexFor["country"]{ recipientviewmodel.setCountryId(referenceIndex: index) } if let index = selectedIndexFor["country"]{ showCountryWithFlag(textField: activeTextField!, url: recipientviewmodel.getCountryFlagUrl(index: index), index: index) } if let index = selectedIndexFor["country"]{ updateParameters["country"] = recipientviewmodel.getCountryIdList()[index] } fetchStates() } else if activeTextField == textFieldTransferReason { if pickerDataReason.count > 0 { if let transferReason = selectedIndexFor["transferReason"]{ recipientviewmodel.setTransferReason(referenceIndex: transferReason) } if let transferReasonIndex = selectedIndexFor["transferReason"]{ textFieldTransferReason.text = pickerDataReason[transferReasonIndex] } } if let transferReason = selectedIndexFor["transferReason"]{ updateParameters["reason"] = recipientviewmodel.getTransferReasonValueList()[transferReason] } } else if activeTextField == textFieldRelation { if pickerDataRelation.count > 0 { if let relationIndex = selectedIndexFor["relation"]{ recipientviewmodel.setRelation(referenceIndex: relationIndex) textFieldRelation.text = pickerDataRelation[relationIndex] } } if let relationIndex = selectedIndexFor["relation"]{ updateParameters["relation"] = recipientviewmodel.getRelationValueList()[relationIndex] } } else if activeTextField == textFieldState { textFieldDistrict.text = "" pickerDataDistrict.removeAll() selectedIndexFor["district"] = 0 if pickerDataState.count > 0{ if let state = selectedIndexFor["state"]{ recipientviewmodel.setState(referenceIndex: state) textFieldState.text = pickerDataState[state] } } startLoading() fetchDistrict() if let state = selectedIndexFor["state"]{ updateParameters["state"] = recipientviewmodel.getStateValueList()[state] } } else if activeTextField == textFieldDistrict { if pickerDataDistrict.count > 0 { if let district = selectedIndexFor["district"]{ recipientviewmodel.setDistrict(referenceIndex: district) textFieldDistrict.text = pickerDataDistrict[district] updateParameters["district"] = recipientviewmodel.getDistrictValueList()[district] } } } } @objc func cancelClick(){ activeTextField?.resignFirstResponder() } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "paymentMethod" { let paymentViewController = segue.destination as! PaymentMethodViewController paymentViewController.recipient = newRecipient } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } extension RecipientFormViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { activeTextField = textField if textField == textFieldCountry || textField == textFieldRelation || textField == textFieldTransferReason || textField == textFieldState || textField == textFieldDistrict { if createNewRecipient { switch textField { case textFieldCountry: pickerData = recipientviewmodel.getCountryNameList() case textFieldRelation: pickerDataRelation = recipientviewmodel.getRelationList() case textFieldTransferReason: pickerDataReason = recipientviewmodel.getTransferReason() case textFieldState: pickerDataState = recipientviewmodel.getStateList() case textFieldDistrict: pickerDataDistrict = recipientviewmodel.getDistrictList() default: return } } pickerView.reloadAllComponents() switch textField { case textFieldCountry: guard pickerData.count > 0 else { textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } if let index = selectedIndexFor["country"]{ pickUp(textField) pickerView.selectRow(index, inComponent: 0, animated: true) recipientviewmodel.setCountryId(referenceIndex: index) } case textFieldRelation: guard pickerDataRelation.count > 0 else { textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } pickUp(textField) if textFieldRelation.text != "" { if let index = pickerDataRelation.index(of: textFieldRelation.text!){ self.selectedIndexFor["relation"] = index pickerView.selectRow(index, inComponent: 0, animated: true) } } case textFieldTransferReason: guard pickerDataReason.count > 0 else { textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } pickUp(textField) if textFieldTransferReason.text != "" { if let index = pickerDataReason.index(of: textFieldTransferReason.text!){ self.selectedIndexFor["transferReason"] = index pickerView.selectRow(index, inComponent: 0, animated: true) } } case textFieldState: guard pickerDataState.count > 0 else { textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } pickUp(textField) if textFieldState.text != ""{ if let index = pickerDataState.index(of: textFieldState.text!){ self.selectedIndexFor["state"] = index pickerView.selectRow(index, inComponent: 0, animated: true) } } case textFieldDistrict: guard pickerDataDistrict.count > 0 else { textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Fetching data", message: "Please fill other fields while some data are being loaded") return } pickUp(textField) if textFieldDistrict.text != ""{ if let index = pickerDataDistrict.index(of: textFieldDistrict.text!) { self.selectedIndexFor["district"] = index pickerView.selectRow(index, inComponent: 0, animated: true) } } default: return } } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { let index: Int = arrayOftextFields.index(of: textField)! guard index < (arrayOftextFields.count-1) else { textField.resignFirstResponder() return true } arrayOftextFields[index+1].becomeFirstResponder() return true } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) switch textField { case textFieldFirstName: recipientviewmodel.updateFirstName(firstName: newString) case textFieldMiddleName: recipientviewmodel.updateMiddleName(middleName: newString) case textFieldLastName: recipientviewmodel.updateLastName(lastName: newString) case textFieldCity: recipientviewmodel.updateCity(city: newString) case textFieldAddress: recipientviewmodel.updateAddress(address: newString) case textFieldMobile: recipientviewmodel.updateMobile(mobile: newString) case textFieldEmail: recipientviewmodel.updateEmail(email: newString) default: return false } return true } func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { switch textField { case textFieldState: if textFieldCountry.text == "" { textFieldCountry.resignFirstResponder() textField.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Select Country!", message: "Please select the country first.") return false } else { return true } case textFieldDistrict: if textFieldState.text == ""{ textFieldCountry.resignFirstResponder() textFieldState.resignFirstResponder() self.popUpMessageInfo(value: 16, title: "Select State/Province!", message: "Please select the State/Province first") return false } else { return true } default: return true } } func textFieldDidEndEditing(_ textField: UITextField) { if recipient != nil { switch textField { case textFieldFirstName: updateParameters["firstName"] = textField.text! case textFieldMiddleName: updateParameters["middleName"] = textField.text! case textFieldLastName: updateParameters["lastName"] = textField.text! case textFieldCountry: if let index = selectedIndexFor["country"]{ updateParameters["country"] = recipientviewmodel.getCountryId(index: index) } case textFieldState: if let index = selectedIndexFor["state"]{ updateParameters["state"] = recipientviewmodel.getStateValue(index: index) } case textFieldDistrict: if let index = selectedIndexFor["district"]{ updateParameters["district"] = recipientviewmodel.getDistrictValue(index: index) } case textFieldCity: updateParameters["city"] = textField.text! case textFieldAddress: updateParameters["address"] = textField.text! case textFieldRelation: if let index = selectedIndexFor["relation"]{ updateParameters["relation"] = recipientviewmodel.getRelationValue(index: index) } case textFieldMobile: updateParameters["mobileNumber"] = textField.text! case textFieldEmail: updateParameters["email"] = textField.text! case textFieldTransferReason: if let index = selectedIndexFor["transferReason"]{ updateParameters["transferReason"] = recipientviewmodel.getTransferReasonValue(index: index) } default: return } } } } extension RecipientFormViewController: UIPickerViewDataSource, UIPickerViewDelegate { func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if activeTextField == textFieldCountry { return pickerData.count } else if activeTextField == textFieldState{ return pickerDataState.count } else if activeTextField == textFieldDistrict{ return pickerDataDistrict.count } else if activeTextField == textFieldRelation{ return pickerDataRelation.count } else if activeTextField == textFieldTransferReason { return pickerDataReason.count } else { return 0 } } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if activeTextField == textFieldCountry { return pickerData[row] } else if activeTextField == textFieldState{ return pickerDataState[row] } else if activeTextField == textFieldDistrict { return pickerDataDistrict[row] }else if activeTextField == textFieldRelation{ return pickerDataRelation[row] } else if activeTextField == textFieldTransferReason{ return pickerDataReason[row] } else { return "" } } func showCountryWithFlag(textField: UITextField, url: String, index: Int) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50)) let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 30, height: 30)) imageView.center = paddingView.center if let flagUrl = URL(string: url) { imageView.sd_setImage(with: flagUrl, placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) } paddingView.addSubview(imageView) textField.leftViewMode = UITextFieldViewMode.always textField.leftView = paddingView textField.text = pickerData[index] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if activeTextField == textFieldCountry { pickerIndex = row } else if activeTextField == textFieldState{ selectedIndexFor["state"] = row } else if activeTextField == textFieldDistrict { selectedIndexFor["district"] = row } else if activeTextField == textFieldRelation{ selectedIndexFor["relation"] = row } else if activeTextField == textFieldTransferReason{ selectedIndexFor["transferReason"] = row } } func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 60 } func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { var myImageView: UIImageView? let myView = UIView(frame: CGRect(x: 0, y: 0, width: pickerView.bounds.width - 30, height: 60)) let myLabel = UILabel(frame: CGRect(x: 60, y: 0, width: pickerView.bounds.width - 90, height: 60 )) myView.addSubview(myLabel) if activeTextField == textFieldCountry{ myLabel.text = pickerData[row] myImageView = UIImageView(frame: CGRect(x: 0, y: 15, width: 40, height: 40)) myImageView?.sd_setImage(with:URL(string: self.recipientviewmodel.getCountryFlagUrl(index: row)), placeholderImage: nil, options: [.progressiveDownload,.scaleDownLargeImages], completed: nil) myView.addSubview(myImageView!) } else if activeTextField == textFieldState { myLabel.text = pickerDataState[row] } else if activeTextField == textFieldDistrict { myLabel.text = pickerDataDistrict[row] } else if activeTextField == textFieldRelation { myLabel.text = pickerDataRelation[row] } else if activeTextField == textFieldTransferReason{ myLabel.text = pickerDataReason[row] } return myView } }