ios - 多个文本字段的 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”...所以 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
}
}
推荐阅读
- javascript - 我正在尝试为奥赛罗游戏制作“flank()”方法。但是我不知道如何遍历每一块并在找到我的一个时停止
- git - Visual Studio:不支持的 URL 协议
- powershell - 如何使用 SET /P 命令在批处理脚本中存储带有空格的文件夹,并在使用 POWERSHELL -Command 时调用存储的变量
- c# - ProcessStartInfo 和事件/异步参数
- r - 如何将 hms 时间格式转换为带有 ms(分钟:秒)格式的纯字符串
- javascript - Javascript 对象是否总是唯一的
- python - 如果有办法检查作者是否有权限,但如果我是(机器人所有者)是作者,它无论如何都可以工作
- protocol-buffers - gRPC 在定义 rpc protobuf 时如何支持关键字流?
- react-native - 我可以在单击选项卡屏幕时禁用 tabBarBadge 吗?
- statistics - 如何解释贝叶斯中的平滑