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]
}
ピッカービューは最初は非表示で、テキストフィールドを選択したときにのみ表示されます。これまでのところ問題ありません。しかし、ピッカービューは空です...
コントローラの外観に依存します。画面ごとに選択アクションが1つしかない場合は、_Table View
_を選択することをお勧めします。選択した行は現在の選択になります。
画面に複数のフィールドがある場合、そのユーザーは次のように操作する必要があります。私の意見では、label
+ button
を上に置き、ユーザーがこれを押すとbutton
画面下部から_Picker View
_を表示します。ユーザーが_Picker View
_のいずれかの行を選択する場合、ラベルテキストを変更しますが、ピッカー自体を非表示にしない場合は、上記の「完了」button
を押して行う必要があります。
お役に立てれば。
更新:
dataSource
のUIPickerView
プロパティを設定するのを忘れているため、問題が発生します。
ただ: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]
}
}
_
最初のセットデリゲート
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]
}
100%動作してテスト済み