【问题标题】:Multiple UIPickerView in the same UIView同一个 UIView 中的多个 UIPickerView
【发布时间】:2015-05-14 13:08:09
【问题描述】:

我是 iOS 开发的初学者,我想创建一个小的 iOS 应用程序。在这个应用程序中,3 个UIPickerViews 应该显示不同的数据。

我的问题出在显示器上。我习惯于在 Android 或 Windows 手机上进行开发,但我不明白如何使用不同的数据填充 UIPickerViews

这是我已经写好的代码:

//
//  ViewController.swift
//  iphoneVersion
//
//  Created by fselva on 13/05/2015.
//  Copyright (c) 2015 fselva. All rights reserved.
//

import UIKit



class ViewController: UIViewController, UIPickerViewDelegate{



@IBOutlet weak var pickerView1: UIPickerView!
@IBOutlet weak var pickerView2: UIPickerView!
@IBOutlet weak var pickerView3: UIPickerView!

var test = ["Todo","Waiting","Maybe","Inbox","Note"]

var test2 = ["@Office","@Computer","@Home","@Meeting", "@Read", "@Achat", "@Call"]



override func viewDidLoad() {
    super.viewDidLoad()
    pickerView1.tag = 1
    pickerView2.tag = 2
    pickerView3.tag = 3
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfComponentsInPickerView(pickerView : UIPickerView!) -> Int{
    return 1
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    if pickerView2.tag == 2 {
        return test.count
    } else if pickerView3 == 3{
        return test2.count
    }
    return 1
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {

    if pickerView2 == 2 {
        return test[row]
    } else if pickerView3 == 3{
        return test2[row]
    }
        return ""
}


}

@IBOutlet weak var pickerView1: UIPickerView!已通过 Ctrl+Click 从情节提要自动创建到 ViewController.swift。

第一个UIPickerView 当前应该什么都不显示。第二个应该显示test,第三个显示test2

在互联网上进行了数小时的调查后,我听说了标签来定义谁必须显示什么,但它不起作用。

我是不是做错了什么,我是否在某处遗漏了什么?

【问题讨论】:

    标签: ios swift uipickerview


    【解决方案1】:

    您不需要标签,只需使用:

     func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
            if pickerView == pickerView1 {
                //pickerView1
            } else if pickerView == pickerView2{
               //pickerView2
            }
    

    也不要忘记在 IB 或代码中设置委托:

    pickerView1.delegate = self
    

    【讨论】:

    • 感谢您的回答,我会检查一下代表是什么,以了解您告诉我的内容。此外,我会尝试你说的解决方案,谢谢。
    • 将 pickerView1.delegate = self 放入 viewDidLoad()
    • 易于实现,比创建新类更好。
    【解决方案2】:

    这是 Swift 3 中 TextField 中的完整源多个 UIPickerView

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    
    @IBOutlet weak var textFiel1: UITextField!
    
    @IBOutlet weak var textFiel_2: UITextField!   
    
    
     let piker1 = UIPickerView()
     let piker2 = UIPickerView()
    
    let country = ["Ban","Ind","PK"]
    let number = ["1","2","3"]
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        piker1.dataSource = self
        piker1.delegate = self
    
        piker2.dataSource = self
        piker2.delegate = self
    
    
        piker1.tag = 1
        piker2.tag = 2;
    
    
    
         textFiel1.inputView = piker1
          textFiel_2.inputView = piker2
    
    
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    
    
    
        if pickerView == piker1 {
            return country.count
    
        } else if pickerView == piker2{
             return number.count
        }
    
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    
    
        if pickerView == piker1 {
            return country[row]
    
        } else if pickerView == piker2{
             return number[row]
        }
        return ""
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == piker1 {
            textFiel1.text = country[row]
              self.view.endEditing(false)
        } else if pickerView == piker2{
            textFiel_2.text = number[row]
              self.view.endEditing(false)
        }
    }
    
    }
    

    【讨论】:

      【解决方案3】:

      您正在将实例与标签进行比较。

      替换:

      func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
          if pickerView2 == 2 {
              return test[row]
          } else if pickerView3 == 3{
              return test2[row]
          }
              return ""
      }
      

      与:

      func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
          if pickerView2.tag == 2 {
              return test[row]
          } else if pickerView3.tag == 3 {
              return test2[row]
          }
              return ""
      }
      

      无论如何,您不需要标记您的选择器。选择器来自数据源和委托方法。您可以比较实例。像这样的:

      func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
          if pickerView2 == pickerView {
              return test[row]
          }
          if pickerView3 == pickerView {
              return test2[row]
          }
          return ""
      }
      

      【讨论】:

      • 感谢您的回答。错过的是代表。几个小时前我已经尝试过了,但没有成功,因为我没有做 pickerViewX.delegate = self.您的解决方案运行良好。
      【解决方案4】:

      我建议在控制器中定义一个变量,然后根据字段选择来决定值

      func textFieldDidBeginEditing(_ textField: UITextField) {
              if(textField == self.txtAge){
                  **isAgeField=0**
                  self.pickUp(txtAge)
              }else{
                  **isAgeField=1**
                  self.pickUpTimezone(timezonetxt)
              }
          }`
      
      then you can add condition inside the picker view as below 
      
      func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
             if isAgeField == 1 {
                  return timeZoneList.count
              }else {
                  return arrAge.count
              }
          }
          func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{
              if isAgeField == 1 {
                  return timeZoneList[row]
              }else {
                  return arrAge[row] as? String
              }
      
      
          }
          func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
              **if isAgeField == 1 {**
                  timeZonepickerViewIndex = row
              }else  {
                  selectedIndex = row
              }
      
          }
      

      【讨论】:

        【解决方案5】:

        试试这个:

            class UserConfig: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
        
            @IBOutlet weak var lblPeso: UILabel!
            @IBOutlet weak var lblAlto: UILabel!
            @IBOutlet weak var pickerView: UIPickerView!
            @IBOutlet weak var btPeso: UIButton!
            @IBOutlet weak var btAlto: UIButton!
        
            var pulsado = 1
        
            let userDefault = UserDefaults.standard
            let pesoArray = [50,51,52,53,54,55,56,57,58,59,
                             60,61,62,63,64,65,66,67,68,69,
                             70,71,72,73,74,75,76,77,78,79,
                             80,81,82,83,84,85,86,87,88,89,
                             90,91,92,93,94,95,96,97,98,99,
                             100,101,102,103,104,105,106,107,108,109,
                             110,111,112,113,114,115,116,117,118,119,
                             120,121,122,123,124,125,126,127,128,120,
                             130]
            let altoArray = [150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
                             160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
                             170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
                             180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
                             190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
                             200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
                             210, 211, 212]
        
            override func viewDidLoad() {
                super.viewDidLoad()
        
                pickerView.delegate = self
                pickerView.dataSource = self
            }
        
            override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                self.view.endEditing(true)
            }
            @IBAction func volver(_ sender: Any) {
        
                self.dismiss(animated: true, completion: nil)
            }
        
            func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
                if pulsado == 1 {
                    return altoArray.count
                } else {
                    return pesoArray.count
                }
            }
        
            func numberOfComponents(in pickerView: UIPickerView) -> Int {
                return 1
            }
        
            func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        
                if pulsado == 1{
                    return String(format: "%i", altoArray[row])
                }else{
                    return String(format: "%i", pesoArray[row])
                }
            }
        
            func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
                if pulsado == 1 {
                    lblAlto.text = String(format: "%i", altoArray[row])
                } else {
                    lblPeso.text = String(format: "%i", pesoArray[row])
                }
            }
            @IBAction func altoPressed(_ sender: Any) {
        
                pulsado = 1
                pickerView.reloadAllComponents()
        
            }
            @IBAction func pesoPressed(_ sender: Any) {
        
                pulsado = 2
                pickerView.reloadAllComponents()
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-18
          • 2012-07-27
          • 1970-01-01
          • 2012-01-25
          • 1970-01-01
          • 1970-01-01
          • 2020-11-12
          • 1970-01-01
          相关资源
          最近更新 更多