简体   繁体   English

根据使用的文本字段更改一个选择器视图的数量

[英]Changing the population of one picker view depending on which textfield is used

I am new to Swift.我是斯威夫特的新手。 To fill some Textfields in my app, I want to use one picker view which changes its population depending on which textfield I want to fill.为了填充我的应用程序中的一些文本字段,我想使用一个选择器视图,该视图根据我要填充的文本字段更改其人口。 My Problem is, that the function textFieldShouldBeginEditing seems not to work.我的问题是,函数textFieldShouldBeginEditing似乎不起作用。 The variable textFieldName doesn't change its name.变量textFieldName不会更改其名称。 Unfortunately all the code I found here is only for Objective-C.不幸的是,我在这里找到的所有代码都只适用于 Objective-C。 I hope you can help me bring this code to work.我希望你能帮我把这段代码带到工作上。

Here is my code:这是我的代码:

@IBOutlet weak var Stadt: UITextField!
@IBOutlet weak var Untergrund: UITextField!
@IBOutlet weak var Groesse: UITextField!
@IBOutlet weak var AnzToreKoerbe: UITextField!
@IBOutlet weak var Platzart: UITextField!
var UntergrundArray = ["Kunstrasen Sand", "Kunstrasen Granulat", "Rasen", "Tartan", "Teer"]
var StadtArray = ["Norderstedt", "Hamburg", "Berlin", "München"]
var GroesseArray = ["1 vs 1", "2 vs 2", "3 vs 3", "4 vs 4", "5 vs 5", "6 vs 6", "7 vs 7"]
var AnzTorKoerbe = ["1", "2", "3", "4"]
var Art = ["Fußball", "Basketball"]
var textFieldName = "Stadt1"

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool{
    if textField.tag == 1{
        textFieldName = "Stadt1"
    }else if textField.tag == 2{
        textFieldName = "Untergrund1"
    }else if textField.tag == 3 {
        textFieldName = "Groesse1"
    }else if textField.tag == 4 {
        textFieldName = "AnzToreKoerbe1"
    }else if textField.tag == 5 {
        textFieldName = "Platzart1"
    }

    return true;
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if (textFieldName.isEqual("Stadt1")) {
        return StadtArray.count
    }else if (textFieldName.isEqual("Untergrund1")) {
        return UntergrundArray.count
    }else if (textFieldName.isEqual("Groesse1")) {
        return GroesseArray.count
    }else if (textFieldName.isEqual("AnzToreKoerbe1")) {
        return AnzTorKoerbe.count
    }else  {
        return Art.count
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if (textFieldName.isEqual("Stadt1")) {
        return StadtArray [row]
    }else if (textFieldName.isEqual("Untergrund1")) {
        return UntergrundArray [row]
    }else if (textFieldName.isEqual("Groesse1")) {
        return GroesseArray [row]
    }else if (textFieldName.isEqual("AnzToreKoerbe1")) {
        return AnzTorKoerbe [row]
    }else  {
       return Art [row]
    }
}

You need to called reloadAllComponents at the end of the textFieldShouldBeginEditing method.您需要在textFieldShouldBeginEditing方法的末尾调用reloadAllComponents

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool{
    if textField.tag == 1{
        textFieldName = "Stadt1"
    }else if textField.tag == 2{
        textFieldName = "Untergrund1"
    }else if textField.tag == 3 {
        textFieldName = "Groesse1"
    }else if textField.tag == 4 {
        textFieldName = "AnzToreKoerbe1"
    }else if textField.tag == 5 {
        textFieldName = "Platzart1"
    }

    somePickerViewProperty.reloadAllComponents()

    return true;
}

Replace somePickerViewProperty with the name of your UIPickerView outlet.somePickerViewProperty替换为您的UIPickerView插座的名称。

There also a much simpler way to write your code:还有一种更简单的方法来编写代码:

var UntergrundArray = ["Kunstrasen Sand", "Kunstrasen Granulat", "Rasen", "Tartan", "Teer"]
var StadtArray = ["Norderstedt", "Hamburg", "Berlin", "München"]
var GroesseArray = ["1 vs 1", "2 vs 2", "3 vs 3", "4 vs 4", "5 vs 5", "6 vs 6", "7 vs 7"]
var AnzTorKoerbe = ["1", "2", "3", "4"]
var Art = ["Fußball", "Basketball"]
var currentData = StadtArray

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool{
    if textField.tag == 1{
        currentData = StadtArray
    }else if textField.tag == 2{
        currentData = UntergrundArray
    }else if textField.tag == 3 {
        currentData = GroesseArray
    }else if textField.tag == 4 {
        currentData = AnzTorKoerbe
    }else if textField.tag == 5 {
        currentData = Art
    }

    somePickerViewProperty.reloadAllComponents()

    return true;
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return currentData.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return currentData[row]
}

Have you set the UITextField delegate to self ?您是否将 UITextField 委托设置为self I can't see it in the code you provided and the methods such as textFieldShouldBeginEditing won't be called if the delegate is not set.我在您提供的代码中看不到它,如果未设置委托,则不会调用textFieldShouldBeginEditing等方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM