如何在Swift中为多个UIpickerviews设置数据?

时间:2015-08-14 12:58:36

标签: swift uipickerview

我有uiviewcontroller uitextfields,当用户点击文本字段uipickerview时,如附件中所示。

如何制作多个uipickerview?例如,当用户点击国家/地区文本字段时,选择器视图会显示国家/地区数组数据,当用户点击性别文本字段时,uipickerview会显示性别数组数据,依此类推。我尝试但只能为一个数组执行此操作,这是我的代码中显示的国家/地区。如果你能告诉我如何为其余的uitextfields做这件事,我将不胜感激。

import UIKit

class testVC: UIViewController,UITextViewDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate,UIPickerViewDelegate,UIPickerViewDataSource {

    var countries = ["USA","UK","Spain" ] 
    var gender = ["Male","Female","Both"]
    var language = ["English","French","Spanish","Other"]

    override func viewDidLoad() {
    super.viewDidLoad()
        var pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 100))

        pickerView.backgroundColor = .whiteColor()

        pickerView.showsSelectionIndicator = true

        var toolBar = UIToolbar()
        toolBar.barStyle = UIBarStyle.Default
        toolBar.translucent = true
        toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
        toolBar.sizeToFit()

        pickerView.delegate = self
        pickerView.dataSource = self

       [![enter image description here][1]][1]
        var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker")
        var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "canclePicker")

        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true


       genderTxt.inputView = pickerView
       genderTxt.inputAccessoryView = toolBar

       countriesTxt.inputView = pickerView
       countriesTxt.inputAccessoryView = toolBar

       categoriesTxt.inputView = pickerView
       categoriesTxt.inputAccessoryView = toolBar

       startDateTxt.inputView = pickerView
       startDateTxt.inputAccessoryView = toolBar

       endDateTxt.inputView = pickerView
       endDateTxt.inputAccessoryView = toolBar

       languageTxt.inputView = pickerView
       languageTxt.inputAccessoryView = toolBar

     func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

        return 1

    }


    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

            return countries.count

    }

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


           return countries[row]
        }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        var itemselected = countries[row]
        countriesTxt.text = itemselected

    }

2 个答案:

答案 0 :(得分:4)

您不需要多个UIPickerView。相反,您需要根据第一响应者文本视图设置选择器视图数据源。您还应该通过调用textFieldShouldBeginEditing方法

来实现reloadAllComponents委托方法来重新加载选择器视图的内容
var pickerView : UIPickerView!  

override func viewDidLoad() {

     self.pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 100))
     NSNotificationCenter.defaultCenter().addObserver(self, selector: ("updatePicker"), name: UITextFieldTextDidBeginEditingNotification, object: nil)
}

func updatePicker(){
   self.pickerView.reloadAllComponents()
}

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if countriesTxt.isFirstResponder(){
             return countries.count
        }else if genderTxt.isFirstResponder(){
             return gender.count
        }
        // continue this way and implement all cases

}

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

        if countriesTxt.isFirstResponder(){
              return countries[row]
        }else if genderTxt.isFirstResponder(){
              return gender[row]

        }
        // continue this way and implement all cases

}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        if countriesTxt.isFirstResponder(){
              var itemselected = countries[row]
              countriesTxt.text = itemselected
        }else if genderTxt.isFirstResponder(){
               var itemselected = gender[row]
              genderTxt.text = itemselected
        } 
        // ...


}

答案 1 :(得分:0)

你应该添加布尔值以了解你想要选择哪种数据,然后你应该检查这些布尔值以了解你想要从中获取数据的数组,并在打开选择器视图时分配正确的值:

import UIKit

class testVC: UIViewController,UITextViewDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate,UIPickerViewDelegate,UIPickerViewDataSource {



    var countries = ["USA","UK","Spain" ]

    var gender = ["Male","Female","Both"]

    var language = ["English","French","Spanish","Other"]

    var countriesFlag = true
    var genderFlag = false
    var languageFlag = false

    override func viewDidLoad() {
        super.viewDidLoad()


        var pickerView = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 100))

        pickerView.backgroundColor = .whiteColor()

        pickerView.showsSelectionIndicator = true


        var toolBar = UIToolbar()
        toolBar.barStyle = UIBarStyle.Default
        toolBar.translucent = true
        toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1)
        toolBar.sizeToFit()

        pickerView.delegate = self
        pickerView.dataSource = self

        [![enter image description here][1]][1]
        var doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker")
        var spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil)
        var cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "canclePicker")

        toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true


        genderTxt.inputView = pickerView
        genderTxt.inputAccessoryView = toolBar

        countriesTxt.inputView = pickerView
        countriesTxt.inputAccessoryView = toolBar

        categoriesTxt.inputView = pickerView
        categoriesTxt.inputAccessoryView = toolBar

        startDateTxt.inputView = pickerView
        startDateTxt.inputAccessoryView = toolBar

        endDateTxt.inputView = pickerView
        endDateTxt.inputAccessoryView = toolBar

        languageTxt.inputView = pickerView
        languageTxt.inputAccessoryView = toolBar

        func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

            return 1

        }

        //Add this delegate to know the clicked textview
        textViewDidBeginEditing(textView: UITextView) {

            if textView == countriesTxt {
                countriesFlag = true
                genderFlag = false
                languageFlag = false
            } else if textView == genderTxt {
                countriesFlag = false
                genderFlag = true
                languageFlag = false
            } else {
                countriesFlag = false
                genderFlag = false
                languageFlag = true
            }

        }

        func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

            if countriesFlag {
                return countries.count
            } else if genderFlag {
                return gender.count
            } else {
                return language.count
            }

        }

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

            if countriesFlag {
                return countries[row]
            } else if genderFlag {
                return gender[row]
            } else {
                return language[row]
            }

        }

        func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

            if countriesFlag {
                var itemselected = countries[row]
                countriesTxt.text = itemselected
            } else if genderFlag {
                var itemselected = gender[row]
                genderTxt.text = itemselected
            } else {
                var itemselected = language[row]
                languageTxt.text = itemselected
            }

        }
}