我是swift的新手,对UIPickerView有疑问。
我创建了两个挑选视图
一个有值 - A,B,C,F
两个有值 - B,C,D,E
我现在想要在这两个选择器视图中实现逻辑。
逻辑是,如果在第一个选择器视图中选择了B和C,那么第二个选择器视图将没有B和C供用户选择。我怎么能做到这一点?
我是一个快速的初学者,所以任何提示都会受到赞赏。
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var Picker1: UIPickerView!
@IBOutlet weak var Picker2: UIPickerView!
@IBOutlet weak var label: UILabel!
var savedVal1 = "" as String
var savedVal2 = "" as String
var Array = ["A", "B", "C", "F"]
var Array2 = ["B", "C", "D", "E"]
var PlacementAnswer = 0
override func viewDidLoad() {
super.viewDidLoad()
Picker1.delegate = self
Picker1.dataSource = self
Picker1.tag = 1
Picker2.delegate = self
Picker2.dataSource = self
Picker2.tag = 2
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == Picker1
{ return Array[row] }
else if pickerView == Picker2
{ return Array2[row] }
return ""
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == Picker1
{ return Array.count }
else if pickerView == Picker2
{ return Array2.count }
return 1
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
}
答案 0 :(得分:0)
使用以下内容为pickerView
实施选择委托功能:
var array3 = Array2 //Create a copy of Array 2
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//Check if picker is picker1 and the chosen value is "B" or "C"
if pickerView == Picker1 {
if Array[row] == "B" || Array[row] == "C" {
//Check if "B" and "C" is available
if let index = Array2.indexOf(Array[row]) {
//Remove it from Picker2 datasource array and reload it
Array2.removeAtIndex(index)
Picker2.reloadAllComponents()
}
}
else {
//If choose another option other than "B" and "C", revert back to the first array
Array2 = array3
Picker2.reloadAllComponents()
}
}
}
老实说,你应该阅读关于Swift代码的发明,变量应该是小写的,而不是大写的
答案 1 :(得分:0)
当用户不会对实际发生的事情感到困惑时,其中一种方法是不从选择器中删除项目。而是向他展示你真正的意思,他会更好地理解在某些组合中没有选项。解决方案可以更简单。
描述:用户从第一个选择器中选择B或C.然后,如果选择了第二个选择器中的B或C,则跳转到下一个可用选项。 此外,我们可以更改不可用的行颜色。
//REMOVED METHOD - not able to change title color
/*func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView == Picker1
{ return Array[row] }
else if pickerView == Picker2
{ return Array2[row] }
return ""
}*/
//ADDED METHOD - for styling of your UIPickerView title
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
let string = pickerView == Picker1 ? Array[row] : Array2[row]
if (pickerView == Picker2 && (row == 1 || row == 2)) {
return NSAttributedString( // gray row, when B or C in Picker2
string: string,
attributes: [NSForegroundColorAttributeName: UIColor.gray]
)
}
return NSAttributedString( // common row
string: string,
attributes: nil)
}
//UPDATED METHOD - to reset second picker if user selects B or C from the second picker
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if (pickerView == Picker1 && (row == 1 || row == 2)) {
print("You selected B or C in first PickerView")
} else if (pickerView == Picker2 && (row == 0 || row == 1)) {
// if already set B or C in first Picker, and user has selected B or C in second picker,
// jump to the next available option
Picker2.selectRow(3, inComponent: 0, animated: true)
}
}