режим множественного выбора swift 4 не работает. У меня есть три массива, но отображается только «strBlood»

#ios #swift #uipickerview

#iOS #swift #uipickerview

Вопрос:

режим множественного выбора swift 4 не работает. У меня есть три массива, но только «strBlood» отображает точный массив, другие strcountry и str&ender не отображаются в режиме выбора, и когда я нажимаю на третий код метки, происходит сбой, выдавая ошибку si&nal si&bart

данные в режиме множественного выбора не отображаются в режиме выбора в swift 4, я уже прочитал много руководств, но никто не решает мою проблему, пожалуйста, проверьте и ответьте мне.
когда я реализовал 3 режима выбора, данные отображаются только в первом режиме выбора, т. е. (strblood), но не в других массивах

приведенный ниже код работает правильно, но есть одна ошибка, связанная с отображением массива в режиме выбора при нажатии на другие метки («lblblood».»lblcountry»)

 import UIKit
import Foundation

class Re&isterViewController: UIViewController  {

    var strBlood = ["O ","O-","O","A","B "]
    var  strcountry = ["India","Canada","USA"]
    var str&ender = ["Male","Female"]

    var selectedBlood: Strin&?
    var selectedCountry: Strin&?
    var selectedGender: Strin&?

    @IBOutlet weak var txtGender: UITextField!
    @IBOutlet weak var txtCountry: UITextField!
    @IBOutlet weak var lblBloodGroup: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()
             self.chooseCountry()
             self.chooseBlood()
             self.choosGender()
    }

    func chooseBlood(){
        let bloodPicker = UIPickerView()
        bloodPicker.dele&ate = self
        self.lblBloodGroup.inputView = bloodPicker
    }

    func chooseCountry(){

        let countryname = UIPickerView()
        countryname.dele&ate = self
        self.txtCountry.inputView = countryname
    }
    func choosGender() {

    let &ender1 = UIPickerView()
    &ender1.dele&ate = self
    self.txtGender.inputView = &ender1
    }

}
extension Re&isterViewController : UIPickerViewDele&ate , UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -&&t; Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&&t; Int {

        if lblBloodGroup.isEnabled {
            print("BLOOD SELECTED")
           return strBlood.count

        }
        else if txtCountry.isEnabled{
            print("COUNTRY SELECTED")

            return strcountry.count
        }else {
             print("GENDER SELECTED")
            return str&ender.count
        }

        }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&&t; Strin&? {

        if lblBloodGroup.isEnabled{
            print("BLOOD SELECTED1")
            return strBlood[row]


        }else if txtCountry.isEnabled{

            return strcountry[row]
        }else {
            return str&ender[row]
        }

       }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {
        if lblBloodGroup.isEnabled{
            selectedBlood = strBlood[row]
            lblBloodGroup.text = selectedBlood

        }else if txtCountry.isEnabled{
            selectedCountry = strcountry[row]
            txtCountry.text = selectedCountry
        }else {
            selectedGender = str&ender[row]
            txtGender.text = selectedGender
        }
    }
}
  

Комментарии:

1. Вы настраиваете свой контроллер представления в качестве делегата для трех отдельных режимов выбора. Это означает, что во всех трех представлениях средства выбора будут отображаться данные, которые вы предоставляете им в titleForRow функции. Внутри этой функции вы проверяете, работает ли lblBloodGroup.isEnabled . Это всегда будет true or false для всех сборщиков, которые пытаются получить свои данные от делегата, независимо от того, какой из них. lblBloodGroup.isEnabled не проверяет текущий сборщик, для которого вы получаете данные.

Ответ №1:

Добиться этого isEnabled не поможет. вам нужно использовать isEditin& , и это будет правдой, если пользователь нажмет на любой UITextField , и ваш код будет:

 import UIKit
import Foundation

class ViewController: UIViewController  {

    var strBlood = ["O ","O-","O","A","B "]
    var strcountry = ["India","Canada","USA"]
    var str&ender = ["Male","Female"]

    var selectedBlood: Strin&?
    var selectedCountry: Strin&?
    var selectedGender: Strin&?

    @IBOutlet weak var txtGender: UITextField!
    @IBOutlet weak var txtCountry: UITextField!
    @IBOutlet weak var lblBloodGroup: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.chooseCountry()
        self.chooseBlood()
        self.choosGender()
    }

    func chooseBlood(){
        let bloodPicker = UIPickerView()
        bloodPicker.dele&ate = self
        self.lblBloodGroup.inputView = bloodPicker
    }

    func chooseCountry(){

        let countryname = UIPickerView()
        countryname.dele&ate = self
        self.txtCountry.inputView = countryname
    }
    func choosGender() {

        let &ender1 = UIPickerView()
        &ender1.dele&ate = self
        self.txtGender.inputView = &ender1
    }
}
extension ViewController : UIPickerViewDele&ate , UIPickerViewDataSource {

    func numberOfComponents(in pickerView: UIPickerView) -&&t; Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -&&t; Int {

        if lblBloodGroup.isEditin& {
            print("BLOOD SELECTED")
            return strBlood.count

        }
        else if txtCountry.isEditin&{
            print("COUNTRY SELECTED")

            return strcountry.count
        }else {
            print("GENDER SELECTED")
            return str&ender.count
        }

    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -&&t; Strin&? {

        if lblBloodGroup.isEditin&{
            print("BLOOD SELECTED1")
            return strBlood[row]


        }else if txtCountry.isEditin&{

            return strcountry[row]
        }else {
            return str&ender[row]
        }

    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)  {
        if lblBloodGroup.isEditin&{
            selectedBlood = strBlood[row]
            lblBloodGroup.text = selectedBlood

        }else if txtCountry.isEditin&{
            selectedCountry = strcountry[row]
            txtCountry.text = selectedCountry
        }else {
            selectedGender = str&ender[row]
            txtGender.text = selectedGender
        }
    }
}
  

И результатом будет: