8068

Reload data and components in UIPickerView

Question:

I'm trying to reload UIPickerView, because, when I chose select for exemple the secon item of a PickerView, at the second PickerView choosing the placement of the selector don't get back to the first, and the data isn't reloaded perfectly, so I try this:

NSNotificationCenter.defaultCenter().addObserver(self, selector: ("updatePicker"), name: UITextFieldTextDidBeginEditingNotification, object: nil) func updatePicker(){ self.pickerView.reloadAllComponents() }

But I get an error:

<blockquote>

fatal error: unexpectedly found nil while unwrapping an Optional value

</blockquote>

Full code:

import UIKit @objc protocol DemandeGratuiteViewControllerDelegate { optional func toggleLeftPanel() optional func collapseSidePanels() } class DemandeGratuiteViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource , UITextFieldDelegate { var delegate: DemandeGratuiteViewControllerDelegate? @IBOutlet var tfProjet: UITextField! @IBOutlet var tfLogement: UITextField! @IBOutlet var libelleValeurActuelleDuBien: UILabel! @IBOutlet var libelleLoyer: UILabel! @IBOutlet var tfValeurActuelleBien: UITextField! @IBOutlet var tfLoyer: UITextField! @IBOutlet var tfProfession: UITextField! @IBOutlet var tfContrat: UITextField! @IBOutlet var pickerView: UIPickerView! @IBOutlet weak var RevenusNetsConstraint: NSLayoutConstraint! @IBOutlet weak var libelleDeclare: UILabel! var pvProjetData = ["-Choisir-", "Rachat de crédits", "Renégociation de crédits"] var pvLogement = ["-Choisir-", "Propriétaire", "Locataire", "Logement de fonction", "Hébérgé par un tiers", "Hébérgé poar la famille"] var pvProfession = ["-Choisir-", "Agriculteur exploitant", "Artisan, commercant", "Cadre", "Chef d'entreprise", "Fonctionnaire", "Intérimaire", "Ouvrier", "Retraité", "Salarié", "Sans emploi"] var pvContrat1 = ["-Choisir-", "Profession libérale"] var pvContrat2 = ["-Choisir-", "CDI", "CDD", "Stagiaire"] var pvContrat3 = ["-Choisir-", "Stagiaire", "Titulaire", "Contractuelle"] var pvContrat4 = ["Intérimaire"] var pvContrat5 = ["Retraité"] var pvContrat6 = ["Sans contrat"] var pvFichage = ["-Choisir-", "Non", "Interdit bancaire", "FICP", "Les deux"] var pvDureeRemb12 = ["-Choisir-", "5", "6", "7", "8", "9", "10", "11", "12"] var pvDureeRemb25 = ["-Choisir", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25"] var pvSituationFamille = ["-Choisir", "Marié(e)", "Célibataire", "Veuf(ve)", "Divorcé(e)", "Pacsé(e)", "Union libre", "En instance de divorce"] var pvNombreEnfants = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"] var pvCivilite = ["--", "M", "Mme", "Mlle"] override func viewDidLoad() { super.viewDidLoad() self.navigationController?.navigationBar.barTintColor = UIColor(red: 38.0/255.0, green: 51.0/255.0, blue: 85.0/255.0, alpha: 1.0) self.navigationController?.navigationBar.titleTextAttributes = [NSFontAttributeName: UIFont(name: "Gotham", size: 13)!, NSForegroundColorAttributeName : UIColor.whiteColor()] self.title = "DEMANDE GRATUITE" NSNotificationCenter.defaultCenter().addObserver(self, selector: ("updatePicker"), name: UITextFieldTextDidBeginEditingNotification, object: nil) let pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 100)) pickerView.showsSelectionIndicator = true pickerView.delegate = self pickerView.dataSource = self tfProjet.inputView = pickerView tfLogement.inputView = pickerView tfProfession.inputView = pickerView tfContrat.inputView = pickerView RevenusNetsConstraint.priority = 999 libelleLoyer.hidden = true libelleValeurActuelleDuBien.hidden = true tfLoyer.hidden = true tfValeurActuelleBien.hidden = true view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:")) } func tfLogementDidChange(){ if(tfLogement.text == "Propriétaire"){ RevenusNetsConstraint.priority = 994 libelleValeurActuelleDuBien.hidden = false tfValeurActuelleBien.hidden = false tfLoyer.hidden = true libelleLoyer.hidden = true } else if (tfLogement.text == "Locataire"){ RevenusNetsConstraint.priority = 994 libelleValeurActuelleDuBien.hidden = true tfValeurActuelleBien.hidden = true tfLoyer.hidden = false libelleLoyer.hidden = false } else{ RevenusNetsConstraint.priority = 999 libelleLoyer.hidden = true libelleValeurActuelleDuBien.hidden = true tfLoyer.hidden = true tfValeurActuelleBien.hidden = true } } func handleTap(sender: UITapGestureRecognizer) { if sender.state == .Ended { view.endEditing(true) } sender.cancelsTouchesInView = false } @IBAction func menuTapped(sender: AnyObject) { print(delegate) delegate?.toggleLeftPanel?() } // returns the number of 'columns' to display. func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int{ return 1 } ////////// func updatePicker(){ self.pickerView!.reloadAllComponents() } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { if tfProjet.isFirstResponder(){ return pvProjetData.count }else if tfLogement.isFirstResponder(){ return pvLogement.count }else if tfProfession.isFirstResponder(){ return pvProfession.count }else if tfContrat.isFirstResponder(){ if tfProfession.text == "Agriculteur exploitant"{ return pvContrat1.count } else if tfProfession.text == "Artisan, commercant"{ return pvContrat2.count } } return 1 } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { if tfProjet.isFirstResponder(){ return pvProjetData[row] }else if tfLogement.isFirstResponder(){ return pvLogement[row] }else if tfProfession.isFirstResponder(){ return pvProfession[row] }else if tfContrat.isFirstResponder(){ if tfProfession.text == "Agriculteur exploitant"{ return pvContrat1[row] } else if tfProfession.text == "Artisan, commercant"{ return pvContrat2[row] } } // continue this way and implement all cases return "" } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if tfProjet.isFirstResponder(){ let itemselected = pvProjetData[row] tfProjet.text = itemselected self.tfProjet.endEditing(true) }else if tfLogement.isFirstResponder(){ let itemselected = pvLogement[row] tfLogement.text = itemselected self.tfLogement.endEditing(true) tfLogementDidChange() }else if tfProfession.isFirstResponder(){ let itemselected = pvProfession[row] tfProfession.text = itemselected self.tfProfession.endEditing(true) }else if tfContrat.isFirstResponder(){ if tfProfession.text == "Agriculteur exploitant"{ let itemselected = pvContrat1[row] tfContrat.text = itemselected self.tfContrat.endEditing(true) } else if tfProfession.text == "Artisan, commercant"{ let itemselected = pvContrat2[row] tfContrat.text = itemselected self.tfContrat.endEditing(true) } } }

Answer1:

Ok, with the information from the comments - specifically this (emphasis mine):

<blockquote>

@Losiowaty I see what you mean, to create a UIPickerView on my StoryBoard and connect it, but why I have a PickerView even if <strong>I don't put a UIPicerView on my StoryBoard</strong>

</blockquote>

The @IBOutlet for the picker view was misleading. With the above information, it seems that the issue is that you never assign to self.pickerView. In viewDidLoad you have this code :

let pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 100)) pickerView.showsSelectionIndicator = true pickerView.delegate = self pickerView.dataSource = self

Simply add self.pickerView = pickerView below this and everything should be fine.

Note, that when you create views programatically you don't need and shouldn't annotate them as @IBOutlets. It makes the code less readable for someone else, and maybe even for you after some time. IBOutlet stands for Interface Builder Outlet.

Recommend

  • Getting Response code 0 in API manager wso2 while Trying to connect Through enterprise Proxy
  • Reporting and knife runs command for opensource chef
  • Elasticsearch file-based index templates not showing up in “/_template” API call
  • onchange function in dropDownList yii2
  • Pandas installed, but cannot be found? Why is that?
  • How to link IDREF FROM XML TO XSLT
  • Reload data and components in UIPickerView
  • How to deploy a Java webapp on Amazon EC2 so that you can efficiently use autoscaling?
  • concat() in XPath
  • ruby telnet to windows 2008 ,execute command error
  • iOS7.1 - install .ipa with wireless AdHoc distribution and Entreprise account
  • Chef Users resource (check if exists?)
  • PHP Open Source eCommerce Software [closed]
  • Display all record on django-filter page startup
  • Calculating revenue share at different tiers
  • Java - how to store multiple phone numbers and keywords related to a person in a contact list
  • is it possible to use supports statement in if statement in chef?
  • Insert reportlab chart into django template
  • Array#to_s in Ruby 2.1 broke my code
  • Format returning date format on Symfony2 FOSRestBundle
  • How to extend chef resource?
  • Locking menu on scroll slightly off
  • Reload UIPickerView crash [duplicate]
  • Custom component with dynamic configuration like jira, jdbc or azurestorage in talend
  • Creating an entity relationship diagram
  • DSC Custom Resource Dependencies
  • How to use Chef PHP cookbook to install version higher than 5.3.3 [closed]
  • I have accidentally uninstalled jack server while building Android AOSP
  • PrimeFaces input components are not highlighted on validation error
  • LINQ - Different results with LINQ to SQL vs LINQPad
  • Why would I extend java.lang.RuntimeException
  • What is the SLA for a single instance VM on Basic / Standard tier of Azure Website
  • Plot ROC curve and calculate AUC in R at specific cutoff info
  • several hexbin plots on one PDF page in R
  • Error: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
  • Is there a way to read an Excel file using Dataflow
  • Using Python objects in C++
  • allocating memory to an array of string
  • Recursive/Hierarchical Query Using Postgres