重新加载UIPickerView中的数据和组件

我试图重新加载UIPickerView ,因为,当我select例如一个PickerView的secon项目,在第二个PickerViewselectselect器的位置不回到第一,数据不完全重新加载,所以我试试这个:

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

但是我得到一个错误:

致命错误:意外地发现零,而解包一个可选值

完整代码:

 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) } } } 

好的,从评论的信息 – 具体来说这(重点是我的):

@Losiowaty我明白你的意思,在我的StoryBoard上创build一个UIPickerView并连接它,但为什么我有一个PickerView,即使我没有在我的StoryBoard上放置一个UIPicerView

select器视图的@IBOutlet是误导性的。 有了上面的信息,似乎问题是你永远不会分配给self.pickerView 。 在viewDidLoad你有这样的代码:

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

只需在下面添加self.pickerView = pickerView ,一切都应该没问题。

请注意,当您以编程方式创build视图时,您不需要也不应将它们标注为@IBOutlet 。 它使得代码对其他人来说不那么可读,甚至在一段时间之后对你来说也是可以的。 IBOutlet代表Interface Builder Outlet。