连接多个 UIPickerView 时,titleForRow 出错
When connecting multiple UIPickerView,having error at titleForRow
我正在为具有 UIDatePicker
、UIPickerView
和 TableView
的汽车创建高级搜索,但我遇到了问题 titleForRow.And 我可以正确地看到数据,如果我隐藏了一个 pickerview(分数)并看到另一个 pickerview(结果)。但是在我打开第二个 pickerview(结果)并打开另一个 pickerview(分数)而不隐藏第一个之后,当我尝试滚动分数选择器时我有错误titleForRow 表示 "Array Index out of Range"。那么,如果我要在一个视图控制器上使用多个 pickerview?我如何以正确的方式连接它们?有什么帮助吗?
这是我为 2picker 和 1date picker 设计的,
如您所见,当我点击其中一个静态 table 单元格时,选择器出现,当我再次点击时,选择器隐藏。
这是我的高级搜索控制器
这是我用来控制 pickerview 和静态 table 单元格的代码
var pickerCollection : String = "Score"
override func viewDidLoad() {
TegKeychain.set("currentView", value: "Advance")
super.viewDidLoad()
datePickerChanged()
//self.scorePicker?.delegate = self
scoreDetailLabel.text = scoresValues[0]
resultDetailLabel.text = resultsValues[0]
detailLabel.text = venue
}
override func viewDidAppear(animated: Bool) {
TegKeychain.set("currentView", value: "Advance")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.section == 0 && indexPath.row == 0 {
toggleDatepicker()
}
if indexPath.section == 2 && indexPath.row == 0{
pickerCollection = "Score"
toggleScorePicker()
scorePicker.reloadAllComponents()
}
if indexPath.section == 2 && indexPath.row == 2{
pickerCollection = "Result"
toggleResultPicker()
resultPicker.reloadAllComponents()
}
println("Section : \(indexPath.section)")
println("Row : \(indexPath.row)")
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if datePickerHidden && indexPath.section == 0 && indexPath.row == 1 {
return 0
}
else if scorePickerHidden && indexPath.section == 2 && indexPath.row == 1{
return 0
}
else if resultPickerHidden && indexPath.section == 2 && indexPath.row == 3{
return 0
}
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerCollection == "Score"{
return scoresValues.count
}
if pickerCollection == "Result"{
return resultsValues.count
}
return 0
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerCollection == "Score"{
return scoresValues[row]
}
if pickerCollection == "Result"{
return resultsValues[row]
}
return ""
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerCollection == "Score"{
scoreDetailLabel.text = scoresValues[row]
}
if pickerCollection == "Result"{
resultDetailLabel.text = resultsValues[row]
}
}
// I will not show Date Picker to make it simple.
结果选择器和分数选择器
/////////////////////////////////////////////////////// Scores ///////////////////////////////////////////////////////////////////
var scorePickerHidden = true
var scores :[String:String] = ["":"All","S":"S","R":"R","RA":"RA","above 5":"Above 5","above 4":"Above 4","above 3":"Above 3","above 2":"Above 2","above 1":"Above 1","above 0":"Above 0"]
var scoresValues : [String] = ["All","S","R","RA","Above 5","Above 4","Above 3","Above 2","Above 1","Above 0"]
func toggleScorePicker() {
scorePickerHidden = !scorePickerHidden
tableView.beginUpdates()
tableView.endUpdates()
}
/////////////////////////////////////////////////////// Results ///////////////////////////////////////////////////////////////////
var resultPickerHidden = true
var results :[String:String] = ["":"All","not yet":"Not Yet","unsold":"Unsold","sold by nego":"Sold by nego","others":"Others"]
var resultsValues : [String] = ["All","Not Yet","Unsold","Sold by nego","Others"]
func toggleResultPicker() {
resultPickerHidden = !resultPickerHidden
tableView.beginUpdates()
tableView.endUpdates()
}
有什么帮助和建议吗?我不能只使用单个选择器,因为它不符合我的要求 design.So,有没有其他方法,当适当的静态单元格被点击时,我可以连接我正确的选择器视图?
如果您要使用多个选择器视图,则必须在属性 Inspector.So 处使用标签 属性,假设我们有两个 UIPickerView
。在属性检查器中,设置每个带有标签 #1 的 UIPickerView 和另一个带有 #2.And 的 UIPickerView 确保它们都连接到同一视图控制器的委托和数据源。
然后在你的代码中,
var scoresValues = []
var resultsValues = []
override func viewDidLoad(){
super.viewDidLoad()
scoreValues = ["a","b",...]
resultsValue = ["c","d",...]
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 1{
return scoresValues.count
}
else{
return resultsValues.count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerView.tag == 1{
return scoresValues[row]
}
else{
return resultsValues[row]
}
}
我展示的是使用 2 个选择器 only.If 你想使用更多选择器,你可以使用 if/else 或开关来处理它们。
我正在为具有 UIDatePicker
、UIPickerView
和 TableView
的汽车创建高级搜索,但我遇到了问题 titleForRow.And 我可以正确地看到数据,如果我隐藏了一个 pickerview(分数)并看到另一个 pickerview(结果)。但是在我打开第二个 pickerview(结果)并打开另一个 pickerview(分数)而不隐藏第一个之后,当我尝试滚动分数选择器时我有错误titleForRow 表示 "Array Index out of Range"。那么,如果我要在一个视图控制器上使用多个 pickerview?我如何以正确的方式连接它们?有什么帮助吗?
这是我为 2picker 和 1date picker 设计的,
如您所见,当我点击其中一个静态 table 单元格时,选择器出现,当我再次点击时,选择器隐藏。
这是我的高级搜索控制器
这是我用来控制 pickerview 和静态 table 单元格的代码
var pickerCollection : String = "Score"
override func viewDidLoad() {
TegKeychain.set("currentView", value: "Advance")
super.viewDidLoad()
datePickerChanged()
//self.scorePicker?.delegate = self
scoreDetailLabel.text = scoresValues[0]
resultDetailLabel.text = resultsValues[0]
detailLabel.text = venue
}
override func viewDidAppear(animated: Bool) {
TegKeychain.set("currentView", value: "Advance")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.section == 0 && indexPath.row == 0 {
toggleDatepicker()
}
if indexPath.section == 2 && indexPath.row == 0{
pickerCollection = "Score"
toggleScorePicker()
scorePicker.reloadAllComponents()
}
if indexPath.section == 2 && indexPath.row == 2{
pickerCollection = "Result"
toggleResultPicker()
resultPicker.reloadAllComponents()
}
println("Section : \(indexPath.section)")
println("Row : \(indexPath.row)")
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if datePickerHidden && indexPath.section == 0 && indexPath.row == 1 {
return 0
}
else if scorePickerHidden && indexPath.section == 2 && indexPath.row == 1{
return 0
}
else if resultPickerHidden && indexPath.section == 2 && indexPath.row == 3{
return 0
}
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerCollection == "Score"{
return scoresValues.count
}
if pickerCollection == "Result"{
return resultsValues.count
}
return 0
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerCollection == "Score"{
return scoresValues[row]
}
if pickerCollection == "Result"{
return resultsValues[row]
}
return ""
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerCollection == "Score"{
scoreDetailLabel.text = scoresValues[row]
}
if pickerCollection == "Result"{
resultDetailLabel.text = resultsValues[row]
}
}
// I will not show Date Picker to make it simple.
结果选择器和分数选择器
/////////////////////////////////////////////////////// Scores ///////////////////////////////////////////////////////////////////
var scorePickerHidden = true
var scores :[String:String] = ["":"All","S":"S","R":"R","RA":"RA","above 5":"Above 5","above 4":"Above 4","above 3":"Above 3","above 2":"Above 2","above 1":"Above 1","above 0":"Above 0"]
var scoresValues : [String] = ["All","S","R","RA","Above 5","Above 4","Above 3","Above 2","Above 1","Above 0"]
func toggleScorePicker() {
scorePickerHidden = !scorePickerHidden
tableView.beginUpdates()
tableView.endUpdates()
}
/////////////////////////////////////////////////////// Results ///////////////////////////////////////////////////////////////////
var resultPickerHidden = true
var results :[String:String] = ["":"All","not yet":"Not Yet","unsold":"Unsold","sold by nego":"Sold by nego","others":"Others"]
var resultsValues : [String] = ["All","Not Yet","Unsold","Sold by nego","Others"]
func toggleResultPicker() {
resultPickerHidden = !resultPickerHidden
tableView.beginUpdates()
tableView.endUpdates()
}
有什么帮助和建议吗?我不能只使用单个选择器,因为它不符合我的要求 design.So,有没有其他方法,当适当的静态单元格被点击时,我可以连接我正确的选择器视图?
如果您要使用多个选择器视图,则必须在属性 Inspector.So 处使用标签 属性,假设我们有两个 UIPickerView
。在属性检查器中,设置每个带有标签 #1 的 UIPickerView 和另一个带有 #2.And 的 UIPickerView 确保它们都连接到同一视图控制器的委托和数据源。
然后在你的代码中,
var scoresValues = []
var resultsValues = []
override func viewDidLoad(){
super.viewDidLoad()
scoreValues = ["a","b",...]
resultsValue = ["c","d",...]
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 1{
return scoresValues.count
}
else{
return resultsValues.count
}
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
if pickerView.tag == 1{
return scoresValues[row]
}
else{
return resultsValues[row]
}
}
我展示的是使用 2 个选择器 only.If 你想使用更多选择器,你可以使用 if/else 或开关来处理它们。