将UIPickerView添加为子视图,非常耐用

时间:2016-08-11 11:55:25

标签: ios swift uipickerview subview

最近我需要一个解决方案来显示一个类似于当前的pickerView来选择某些属性的数据,比如profile。 我做的是 1,创建一个空项目 2,创建一个AViewController,用作子视图。我在该视图中添加了一个pickerView和一个导航栏,并将视图的高度调整为260左右。 3,在AViewController的类中编写代码。

class APickerViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var pickerView:UIPickerView!
let dataList = [["a","b","c","d"]]

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    //pickerView.dataSource = self
    //pickerView.delegate = self
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return dataList.count
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dataList[component].count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return dataList[component][row]
}

4,在Main ViewController中编写代码,将AViewController的View添加为子视图。

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let pickerViewController = storyboard?.instantiateViewController(withIdentifier: String(APickerViewController.self)) as! APickerViewController

    self.view.addSubview(pickerViewController.view)
    self.view.bringSubview(toFront: pickerViewController.view)

    pickerViewController.view.frame = CGRect(x: 0, y: self.view.frame.height - 300, width: self.view.frame.width, height: 300)



}

这里也有一个问题,实际上我并不确定区别。 答:

let pickerViewController = storyboard?.instantiateViewController(withIdentifier: String(APickerViewController.self)) as! APickerViewController

B:

let pickerViewController = APickerViewController()

A和B的不同之处是什么?如果我做了一些接口生成器的@IBOutlet设置会受到影响还是什么?

5,去... ...得到... ...

功能

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dataList[component].count
}

有时会多次被叫,有时候不会被叫。

并且数据没有在pickerView中显示,有时只显示第1,2行而没有其他数据,如果我向上或向下轻拂那些1,2行数据就消失了。

如果有人有更好的解决方案使用pickerView作为选项弹出窗口吗?

帮助。

由于

1 个答案:

答案 0 :(得分:0)

class EditViewController: UIViewController,UITextFieldDelegate,UIPickerViewDelegate{ 

var picker : UIPickerView = UIPickerView()
 var toolBar : UIToolbar = UIToolbar() 
 @IBOutlet var txtFieldState: UITextField!
 var stateArray = ["Andaman & Nicobar Island","Andhra Pradesh","Arunachal Pradesh","Assam","Bihar","Chandigarh","Chhattisgarh","Dadra & Nagar"]
  override func viewDidLoad() {
        super.viewDidLoad()
txtFieldState.delegate = self
}
func textFieldDidBeginEditing(textField: UITextField) {
if textField == txtFieldState{ 
            txtFieldState.inputView = picker
            txtFieldState.inputAccessoryView = toolBar
            self.configurePicker()
}
    }

func configurePicker()
    {
        picker.alpha = 1.0
        picker.backgroundColor = UIColor(red:241/255.0, green:241/255.0, blue:241/255.0, alpha: 1.0)
        picker.showsSelectionIndicator = true
        picker.delegate = self
        picker.selectedRowInComponent(0)
        let screenRect = self.view.frame
        let pickerSize = picker.sizeThatFits(CGSizeZero)

        let x = screenRect.origin.x + (screenRect.size.width / 2) - (pickerSize.width / 2)

        let pickerRect = CGRectMake(x,
                                    screenRect.origin.y + (screenRect.size.height) - (pickerSize.height),
                                    pickerSize.width,
                                    pickerSize.height)

        picker.frame = pickerRect

        let toolbarSize = toolBar.sizeThatFits(CGSizeZero)
        toolBar.frame = CGRectMake(x,pickerRect.origin.y, // right under the picker
            pickerSize.width, // make them the same width
            toolbarSize.height)

    }
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){
        dropState = row
        txtFieldState.text = "\(stateArray[row])"
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    {
        return stateArray[row]
    }
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {

        return stateArray.count
    }

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