在 UIPickerView 中重新加载数据和组件
Reload data and components in UIPickerView
我正在尝试重新加载 UIPickerView
,因为当我选择 select 例如 PickerView 的第二个项目时,在第二个 PickerView 选择 select 的位置或者不回到第一个,并且数据没有完美地重新加载,所以我试试这个:
NSNotificationCenter.defaultCenter().addObserver(self, selector: ("updatePicker"), name: UITextFieldTextDidBeginEditingNotification, object: nil)
func updatePicker(){
self.pickerView.reloadAllComponents()
}
但是我得到一个错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
完整代码:
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 I see what you mean, to create a UIPickerView on my
StoryBoard and connect it, but why I have a PickerView even if I don't
put a UIPicerView on my StoryBoard
选择器视图的 @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
就可以了。
请注意,当您以编程方式创建视图时,您不需要也不应将它们注释为 @IBOutlet
s。它会降低代码对其他人的可读性,甚至在一段时间后对您来说也是如此。 IBOutlet
代表 Interface Builder Outlet。
我正在尝试重新加载 UIPickerView
,因为当我选择 select 例如 PickerView 的第二个项目时,在第二个 PickerView 选择 select 的位置或者不回到第一个,并且数据没有完美地重新加载,所以我试试这个:
NSNotificationCenter.defaultCenter().addObserver(self, selector: ("updatePicker"), name: UITextFieldTextDidBeginEditingNotification, object: nil)
func updatePicker(){
self.pickerView.reloadAllComponents()
}
但是我得到一个错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
完整代码:
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 I see what you mean, to create a UIPickerView on my StoryBoard and connect it, but why I have a PickerView even if I don't put a UIPicerView on my StoryBoard
选择器视图的 @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
就可以了。
请注意,当您以编程方式创建视图时,您不需要也不应将它们注释为 @IBOutlet
s。它会降低代码对其他人的可读性,甚至在一段时间后对您来说也是如此。 IBOutlet
代表 Interface Builder Outlet。