web-dev-qa-db-ja.com

UIPickerviewベストプラクティス?

1つの簡単な質問:登録プロセスで、値のリストから値を選択するようユーザーに依頼したいと思います。

View Controllerを使用してそこにすべてのテキストフィールドを追加し、値に対してピッカービューを追加するのは正しい方法ですか?ピッカービューにはテキストフィールド領域の間に非常に多くのスペースが必要なので、この場合のベストプラクティスはどうなるのでしょうか。

これはこれまでの私のコードです:

class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{

@IBOutlet weak var gradeTextField: UITextField!
@IBOutlet weak var gradePicker: UIPickerView!

let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]

func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int{
    return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
    return gradePickerValues.count
}
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return gradePickerValues[row]
}
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
    gradeTextField.text = gradePickerValues[row]
    self.view.endEditing(true)
}

override func viewDidLoad() {
    super.viewDidLoad()

    statusMessageLabel.hidden = true

    gradePicker.dataSource = self
    gradePicker.delegate = self
    gradePicker.hidden = true

    gradeTextField.inputView = UIPickerView()
    gradeTextField.text = gradePickerValues[0]

}

ピッカービューは最初は非表示で、テキストフィールドを選択したときにのみ表示されます。これまでのところ問題ありません。しかし、ピッカービューは空です...

controller view with open picker view

18
user1555112

コントローラの外観に依存します。画面ごとに選択アクションが1つしかない場合は、_Table View_を選択することをお勧めします。選択した行は現在の選択になります。

画面に複数のフィールドがある場合、そのユーザーは次のように操作する必要があります。私の意見では、label + buttonを上に置き、ユーザーがこれを押すとbutton画面下部から_Picker View_を表示します。ユーザーが_Picker View_のいずれかの行を選択する場合、ラベルテキストを変更しますが、ピッカー自体を非表示にしない場合は、上記の「完了」buttonを押して行う必要があります。

お役に立てれば。


更新

dataSourceUIPickerViewプロパティを設定するのを忘れているため、問題が発生します。

ただ:viewDidLoad()の_gradePicker.dataSource = self_

ここでプロトコルを実装することを忘れないでください:_class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource_


更新2

ついにできました。 textFiledのinputViewにUIPickerViewを追加する場合、IBにあるべきではありません。したがって、ストーリーボード(または使用する場合は.xib)から削除できます。

次に、コードを次のように変更します。

_class RegisterViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var gradeTextField: UITextField!
    var gradePicker: UIPickerView!

    let gradePickerValues = ["5. Klasse", "6. Klasse", "7. Klasse"]

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

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
        return gradePickerValues.count
    }

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

    func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int){
        gradeTextField.text = gradePickerValues[row]
        self.view.endEditing(true)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        gradePicker = UIPickerView()

        gradePicker.dataSource = self
        gradePicker.delegate = self

        gradeTextField.inputView = gradePicker
        gradeTextField.text = gradePickerValues[0]
    }
}
_
28
Alexander Zimin

最初のセットデリゲート

UIPickerViewDataSource,UIPickerViewDelegate

uIPickerViewのIBOutletを設定します

@IBOutlet weak var pickerView: UIPickerView!

データの配列を取得する

var arrayFruits = [String]()

ViewDidLoad()でこのコードを記述します

  arrayFruits = ["Apple","Banana","Orange","Grapes","Watermelon"]
  self.pickerView.dataSource = self
  self.pickerView.delegate = self

ピッカービューデリゲートメソッドを記述します。

 //MARK: - Pickerview method
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return arrayFruits.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return arrayFruits[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    self.labelFruit.text = arrayFruits[row]
}

enter image description here

100%動作してテスト済み

5