ios - 多个文本字段的 PickerView 只显示一个数组

标签 ios swift xcode uitextfield uipickerview

我有一个奇怪的问题,但我想你们可以很容易地告诉我这个错误。我正在为多个文本字段使用选择器 View 。但它只显示每个文本字段的“最后一个数组”,并将最后一个文本字段中所选行的所有内容推到顶部。
因此,似乎每个文本字段只控制最后一个文本字段。

这是涉及的代码,希望你们能帮助我:

class SignUpViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {




    //Mark: Properties


    @IBOutlet weak var genderPicker: UITextField!
    @IBOutlet weak var branchePicker: UITextField!
    @IBOutlet weak var countryPicker: UITextField!




    // Picker View Arrays
    let genders = ["male", "female", "non-binary"]
    let branches = ["Advertising", "Architecture", "Design: Product", "Design: Graphic", "Design: Fashion", "Design: Others", "Film/ Video & TV", "IT", "Museums & Galleries", "Music", "Photography", "Performing & Visual Arts", "Radio", "Others"]
    let countries = ["Austria", "Australia", "USA", "Germany"]

    // Picker View
    var pickerViewSignUp = UIPickerView()



    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.





        // Pickers

        pickerViewSignUp.delegate = self
        pickerViewSignUp.dataSource = self


        // Delegates
        genderPicker.textAlignment = .center
        genderPicker.inputView = pickerViewSignUp
        genderPicker.placeholder = "Select Gender"

        branchePicker.textAlignment = .center
        branchePicker.inputView = pickerViewSignUp
        branchePicker.placeholder = "Select Branch"

        countryPicker.textAlignment = .center
        countryPicker.inputView = pickerViewSignUp
        countryPicker.placeholder = "Select Country"



    }


    // Mark: PickerViews
            // List of the SignUp used Drop Down Items

            // TextField delegate

    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

        pickerViewSignUp.reloadAllComponents()

             return true
         }


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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if pickerViewSignUp == genderPicker {
            return genders.count

        }   else if pickerViewSignUp == branchePicker {
            return branches.count

        } else {return countries.count}

    }


    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerViewSignUp == genderPicker {
            return genders[row]
        } else if  pickerViewSignUp == branchePicker {
            return branches[row] } else {return countries[row]}
    }


    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {

        if pickerViewSignUp == genderPicker {
            genderPicker.text = genders[row]
        } else if pickerViewSignUp == branchePicker {
            branchePicker.text = branches[row]
        } else {countryPicker.text = countries[row]}
    }

}

最佳答案

这是我的解决方案...使用枚举来跟踪选定的状态并添加 UITextFieldDelegates:

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {


//Mark: Properties
@IBOutlet weak var genderPicker: UITextField!
@IBOutlet weak var branchePicker: UITextField!
@IBOutlet weak var countryPicker: UITextField!

enum TextFieldType {
    case gender
    case branche
    case country
    case none
}

// Picker View Arrays
let genders = ["male", "female", "non-binary"]
let branches = ["Advertising", "Architecture", "Design: Product", "Design: Graphic", "Design: Fashion", "Design: Others", "Film/ Video & TV", "IT", "Museums & Galleries", "Music", "Photography", "Performing & Visual Arts", "Radio", "Others"]
let countries = ["Austria", "Australia", "USA", "Germany"]

// Picker View
var pickerViewSignUp = UIPickerView()
var selectedPikerType =  TextFieldType.none

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.


    // Pickers

    pickerViewSignUp.delegate = self
    pickerViewSignUp.dataSource = self


    // Delegates
    genderPicker.textAlignment = .center
    genderPicker.inputView = pickerViewSignUp
    genderPicker.placeholder = "Select Gender"
    genderPicker.delegate = self

    branchePicker.textAlignment = .center
    branchePicker.inputView = pickerViewSignUp
    branchePicker.placeholder = "Select Branch"
    branchePicker.delegate = self

    countryPicker.textAlignment = .center
    countryPicker.inputView = pickerViewSignUp
    countryPicker.placeholder = "Select Country"
    countryPicker.delegate = self
}


// Mark: PickerViews
        // List of the SignUp used Drop Down Items

        // TextField delegate


func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

    switch textField {
    case genderPicker: selectedPikerType    = .gender
    case branchePicker: selectedPikerType   = .branche
    case countryPicker: selectedPikerType   = .country
    default: selectedPikerType              = .none
    }


    pickerViewSignUp.reloadAllComponents()

    return true
}


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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    switch selectedPikerType {
    case .branche   : return branches.count
    case .country   : return countries.count
    case .gender    : return genders.count
    case .none      : return 0
    }

}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    switch selectedPikerType {
    case .branche   : return branches[row]
    case .country   : return countries[row]
    case .gender    : return genders[row]
    case .none      : return nil
    }
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {

    switch selectedPikerType {
    case .branche   : branchePicker.text = branches[row]
    case .country   : countryPicker.text = countries[row]
    case .gender    : genderPicker.text = genders[row]
    case .none      : break
    }
}

}

我还建议您更好地命名变量...如果对象是文本字段,请使用前缀“txt”...所以 txtGender 等等。它更清晰。
还使用扩展来拆分数据源和委托(delegate),这使得它更具可读性。 :)

你可以这样写一个扩展:
extension ViewController: UITextFieldDelegate {

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {

       switch textField {
       case genderPicker: selectedPikerType    = .gender
       case branchePicker: selectedPikerType   = .branche
       case countryPicker: selectedPikerType   = .country
       default: selectedPikerType              = .none
       }


       pickerViewSignUp.reloadAllComponents()

       return true
   }

}

关于ios - 多个文本字段的 PickerView 只显示一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60489686/

相关文章:

ios - 查找 view.subviews 中的所有按钮

swift - 如何使用 SKPhysicsJointPin 连接两个 SKSpriteNode - swift

ios - 使用 Alamofire 的 Http 请求

xcode - 如何使 Xcode 中的 DerivedData 或 Build Location 与项目相关

ios - 准备 iOS 应用,以便稍后添加应用内购买

ios - 如何将地理坐标转换为准确的地址?

ios - 在自定义 View 的 Controller 中创建自定义 IBAction

iphone - 在 iPhone 模拟器上模拟位置更新

swift - 如何将标签栏背景图像设置为清晰图像

ios - RestKit 与主键的关系映射