PickerView для нескольких текстовых полей показывает только один массив - PullRequest
1 голос
/ 02 марта 2020

У меня странная проблема, но я думаю, вы, ребята, можете легко показать мне ошибку. Я использую вид выбора для нескольких текстовых полей. Но он показывает только «последний массив» для каждого текстового поля и помещает поверх всей выбранной строки в последнем текстовом поле. Поэтому кажется, что каждое текстовое поле контролирует только последнее текстовое поле.

Вот соответствующий код, надеюсь, вы, ребята, можете мне помочь:

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

}

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Это мое решение ... используйте enum для отслеживания выбранного состояния и добавьте 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 и так далее. Это намного понятнее. Используйте также расширения для разделения источников данных и делегатов, что делает все это более читабельным. :)

Вы можете написать расширение следующим образом:

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
   }

}

0 голосов
/ 02 марта 2020

В вашем классе есть глобальная переменная textField для получения экземпляра textField, который вы редактируете, и присваивайте значение при редактировании.

В методах делегата и источника данных pickerView выполняется сравнение между текущим textField и остальными. элементов textField. Это должно работать.

Ниже приведен код для вашей справки:

class SignupViewController {

var currentTextfield: UITextField?

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

// TextField delegate

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    currentTextfield = textField
    pickerViewSignUp.reloadAllComponents()
    return true
}


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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    switch currentTextfield {
    case genderPicker:
        return genders.count
    case branchePicker:
        return branches.count
    default
        return countries.count
    }
}

}

...