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



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

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

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"。。。所以txt性别等等。它更清楚。还可以使用扩展来拆分数据源和委派,这会使数据源更具可读性。:(

你可以写这样的扩展:

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
}

}

在类中有一个全局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
}
}

}

最新更新