UI依赖第一个组件的 PickerView 不更新 UI
UIPickerView depending on first Component does not update UI
我想构建一个带有嵌套数据和 2 个组件的 UI选择器。 The 2nd Component should be dependent on the selection of the 1st Component (e.g. when selected fruits -> display banana, apple...; when selected vegetables -> display tomatoes...).
这有效,但是第二个组件的 UI 没有直接更新。我必须点击第二个组件才能看到标题。我尝试在选择后更新组件 (picker.reloadComponent(1)
) 以及所有组件 picker.reloadAllComponents()
。
有什么想法吗?
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var picker: UIPickerView!
var plants = [Dictionary<String, Any>]()
var groups:[String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
plants.append([
"name": "Fruits",
"groups": [
"Banana",
"Apple"
]
])
plants.append([
"name": "Veggies",
"groups": [
"Tomatoe",
"Salad",
"Cucumber"
]
])
if plants[0]["groups"] != nil {
groups = plants[0]["groups"] as! Array
}
picker.delegate = self
picker.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return plants.count
} else if component == 1 {
return groups.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
// Update groups array, based on selection
if plants[row]["groups"] != nil {
groups = plants[row]["groups"] as! Array
}
picker.reloadComponent(1) //also tried picker.reloadAllComponents() here
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
if plants[row]["name"] != nil {
return plants[row]["name"] as! String
}
} else if component == 1 {
// return values of current group
return groups[row]
}
return ""
}
}
提前致谢!
Swift 4.2 / xCode 10
您的代码运行良好。如果您的问题是您希望将第二个组件重新加载到它的第一个项目,请在 picker.reloadComponent(1)
之后尝试此操作:
picker.selectRow(0, inComponent: 1, animated: true)
否则请更具体地说明问题。
我想构建一个带有嵌套数据和 2 个组件的 UI选择器。 The 2nd Component should be dependent on the selection of the 1st Component (e.g. when selected fruits -> display banana, apple...; when selected vegetables -> display tomatoes...).
这有效,但是第二个组件的 UI 没有直接更新。我必须点击第二个组件才能看到标题。我尝试在选择后更新组件 (picker.reloadComponent(1)
) 以及所有组件 picker.reloadAllComponents()
。
有什么想法吗?
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var picker: UIPickerView!
var plants = [Dictionary<String, Any>]()
var groups:[String] = [String]()
override func viewDidLoad() {
super.viewDidLoad()
plants.append([
"name": "Fruits",
"groups": [
"Banana",
"Apple"
]
])
plants.append([
"name": "Veggies",
"groups": [
"Tomatoe",
"Salad",
"Cucumber"
]
])
if plants[0]["groups"] != nil {
groups = plants[0]["groups"] as! Array
}
picker.delegate = self
picker.dataSource = self
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 2
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if component == 0 {
return plants.count
} else if component == 1 {
return groups.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if component == 0 {
// Update groups array, based on selection
if plants[row]["groups"] != nil {
groups = plants[row]["groups"] as! Array
}
picker.reloadComponent(1) //also tried picker.reloadAllComponents() here
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if component == 0 {
if plants[row]["name"] != nil {
return plants[row]["name"] as! String
}
} else if component == 1 {
// return values of current group
return groups[row]
}
return ""
}
}
提前致谢!
Swift 4.2 / xCode 10
您的代码运行良好。如果您的问题是您希望将第二个组件重新加载到它的第一个项目,请在 picker.reloadComponent(1)
之后尝试此操作:
picker.selectRow(0, inComponent: 1, animated: true)
否则请更具体地说明问题。