gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:12:47 25 4
gpt4 key购买 nike

我有一个奇怪的问题,但我想你们可以很容易地告诉我这个错误。我正在为多个文本字段使用选择器 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com