正在寻找一个解决方案,根据在同一视图控制器中选择的另一个选取器视图来填充选取器视图。第一个选择一个类别。第二类是该类别的项目。
以下是我(Swift初学者)的想法:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
var countryClasses = ["US", "EU", "JP"]
var usItems = ["usitem1", "usitem2", "usitem3", "usitem4", "usitem5"]
var euItems = ["euitem1", "euitem2", "euitem3", "euitem4", "euitem5"]
var jpItems = ["jpitem1", "jpitem2", "jpitem3", "jpitem4", "jpitem5"]
@IBOutlet weak var countryPicker: UIPickerView!
@IBOutlet weak var itemPicker: UIPickerView!
override func viewDidLoad() {
super.viewDidLoad()
self.countryPicker.dataSource = self;
self.countryPicker.delegate = self;
self.itemPicker.dataSource = self;
self.itemPicker.delegate = self;
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return countryClasses.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
return countryClasses[row]
}
}
由于两个选取器都使用同一个委托,当您的委托方法运行时,您需要一种方法来识别它们,而且您当前的数组结构意味着您需要一种在选择国家/地区时选择每个项数组的方法。
为所选项目数组创建一个存储
var selectedItemsArray = []
为您的委托方法添加一些检查
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView == countryPicker {
return countryClasses.count
} else if pickerView == itemPicker {
return selectedItemsArray.count
}
return 0
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerView == countryPicker {
return countryClasses[row]
} else if pickerView == itemPicker {
return selectedItemsArray[row]
}
return 0
}
然后您需要实现did-Select行来设置项目存储并重新加载数据
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView == countryPicker {
switch row {
case 0:
selectedItemsArray = usItems
case 1:
selectedItemsArray = euItems
case 2:
selectedItemsArray = jpItems
default:
selectedItemsArray = []
}
// IMPORTANT reload the data on the item picker
itemPicker.reloadAllComponents()
} else if pickerView == itemPicker {
// Get the current item
var item = selectedItemsArray[row]
// Assign value to a label based on which array we are using
if selectedItemsArray == usItems {
usLabel.text = item
} else if selectedItemsArray == euItems {
euLabel.text = item
} else if selectedItemsArray == jpItems {
jpLabel.text = item
}
}
}
我还没有测试过这个代码,但逻辑应该是正确的。
将每个选取器视图与TAG关联(以便可以识别它们),然后在选取器代理中根据这些标识符识别这些选取器,并显示另一个
谢谢@Wez!
在Swift 2.2中,小而重要的修正将函数返回为String,这使它非常有效。
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerView == countryPicker {
return countryClasses[row]
} else if pickerView == itemPicker {
return selectedItemsArray[row]
}
return selectedItemsArray[row] as? String
}