简体   繁体   中英

UIPickerView showing empty grey box Swift

I haven't a whole lot of code, so I might as well copy it here.

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{

    var buildings = ["BankBuilding", "Cinema" , "CornerShop", "Greg's House"]

    @IBOutlet weak var buildText: UITextField!

    var buildPickers:UIPickerView = UIPickerView()

    override func viewDidLoad() {
        super.viewDidLoad()

        buildPickers = UIPickerView()
        buildPickers.delegate = self
        buildPickers.hidden = true;
        buildText.inputView = buildPickers
        buildText.text = buildings[0]        
    }

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        println("Count: \(buildings.count)")
        return buildings.count
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        println("creating title: \(buildings[row])")
        return buildings[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        println("Selected: \(buildings[row])")
        buildText.text = buildings[row]
        buildPickers.hidden = true;
    }

    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        buildPickers.hidden = false
        return false
    }
}

The print statements are correct. For numberOfRows... and titleForRow it is printing the correct Strings.

But there is no prints for didSelectRow because, well, I can't select a row.

This is what I get:

在此处输入图片说明

You can ignore the Google Map in the background, that shouldn't interfere with the Picker View and is just set up in the StoryBoard.

The Grey window appears when I click on the textField but never shows any content. But the print statements say otherwise.

Does anyone know why this is the case?

Just add this line in your viewDidLoad method:

buildPickers.dataSource = self

And your code will be:

override func viewDidLoad() {
    super.viewDidLoad()

    buildPickers = UIPickerView()
    buildPickers.delegate = self
    buildPickers.dataSource = self
    buildPickers.hidden = true;
    buildText.inputView = buildPickers
    buildText.text = buildings[0]        
}

And it will show your data.

UPDATE:

It is not showing because you set it hidden in your viewDidLoad .

Just remove this line from your code:

buildPickers.hidden = true

Here is your working code:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{

    var buildings = ["BankBuilding", "Cinema" , "CornerShop", "Greg's House"]

    @IBOutlet weak var buildText: UITextField!

    var buildPickers:UIPickerView = UIPickerView()

    override func viewDidLoad() {
        super.viewDidLoad()

        buildPickers = UIPickerView()
        buildPickers.delegate = self
        buildPickers.hidden = true
        buildText.delegate = self        //set delegate for textField
        buildText.inputView = buildPickers
        buildText.text = buildings[0]
    }

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        println("Count: \(buildings.count)")
        return buildings.count
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        println("creating title: \(buildings[row])")
        return buildings[row]
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
    {
        println("Selected: \(buildings[row])")
        buildText.text = buildings[row]
        buildPickers.hidden = true;
    }


    //this method will call when you click on textField
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        buildPickers.hidden = false
        return true
    }
}

Is the delegate set on the text field? Are you getting the callback which you use to un-hide the picker?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM