前提・実現したいこと
SwiftでPickerViewを使ってみようと思い、このサイトに載っていたコードを動かしてみたのですが、
「ドラムロール各タイトル」の「list[row]」のところでエラーが出ます。
発生している問題・エラーメッセージ
Use of unresolved identifier 'list'
該当のソースコード
swift
1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var textField: UITextField! 5 6 var pickerView: UIPickerView = UIPickerView() 7 let list: [String] = ["メインクーン", "シャム", "ロシアンブルー", "アメリカンショートヘア", "ネベロング", "ビクシーボブ", "ラガマフィン", "ラパーマ"] 8 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 // ピッカー設定 13 pickerView.delegate = self 14 pickerView.dataSource = self 15 pickerView.showsSelectionIndicator = true 16 17 // 決定バーの生成 18 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) 19 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 20 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 21 toolbar.setItems([spacelItem, doneItem], animated: true) 22 23 // インプットビュー設定 24 textField.inputView = pickerView 25 textField.inputAccessoryView = toolbar 26 } 27 28 // 決定ボタン押下 29 @objc func done() { 30 textField.endEditing(true) 31 textField.text = "(list[pickerView.selectedRow(inComponent: 0)])" 32 } 33} 34 35extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource { 36 37 // ドラムロールの列数 38 func numberOfComponents(in pickerView: UIPickerView) -> Int { 39 return 1 40 } 41 42 // ドラムロールの行数 43 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 44 /* 45 列が複数ある場合は 46 if component == 0 { 47 } else { 48 ... 49 } 50 こんな感じで分岐が可能 51 */ 52 return list.count 53 } 54 55 // ドラムロールの各タイトル 56 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 57 /* 58 列が複数ある場合は 59 if component == 0 { 60 } else { 61 ... 62 } 63 こんな感じで分岐が可能 64 */ 65 return list[row] 66 } 67 68 /* 69 // ドラムロール選択時 70 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 71 self.textField.text = list[row] 72 } 73 */ 74} 75 76import UIKit 77 78class ViewController: UIViewController { 79 @IBOutlet weak var textField: UITextField! 80 81 var pickerView: UIPickerView = UIPickerView() 82 let list: [String] = ["メインクーン", "シャム", "ロシアンブルー", "アメリカンショートヘア", "ネベロング", "ビクシーボブ", "ラガマフィン", "ラパーマ"] 83 84 override func viewDidLoad() { 85 super.viewDidLoad() 86 87 // ピッカー設定 88 pickerView.delegate = self 89 pickerView.dataSource = self 90 pickerView.showsSelectionIndicator = true 91 92 // 決定バーの生成 93 let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: 35)) 94 let spacelItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) 95 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(done)) 96 toolbar.setItems([spacelItem, doneItem], animated: true) 97 98 // インプットビュー設定 99 textField.inputView = pickerView 100 textField.inputAccessoryView = toolbar 101 } 102 103 // 決定ボタン押下 104 @objc func done() { 105 textField.endEditing(true) 106 textField.text = "(list[pickerView.selectedRow(inComponent: 0)])" 107 } 108} 109 110extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource { 111 112 // ドラムロールの列数 113 func numberOfComponents(in pickerView: UIPickerView) -> Int { 114 return 1 115 } 116 117 // ドラムロールの行数 118 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 119 /* 120 列が複数ある場合は 121 if component == 0 { 122 } else { 123 ... 124 } 125 こんな感じで分岐が可能 126 */ 127 return list.count 128 } 129 130 // ドラムロールの各タイトル 131 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 132 /* 133 列が複数ある場合は 134 if component == 0 { 135 } else { 136 ... 137 } 138 こんな感じで分岐が可能 139 */ 140 return list[row] 141 } 142 143 /* 144 // ドラムロール選択時 145 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 146 self.textField.text = list[row] 147 } 148 */ 149}
試したこと
// ドラムロールの各タイトル func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { /* 列が複数ある場合は if component == 0 { } else { ... } こんな感じで分岐が可能 */ let list: [String] = ["メインクーン", "シャム", "ロシアンブルー", "アメリカンショートヘア", "ネベロング", "ビクシーボブ", "ラガマフィン", "ラパーマ"] return list[row] }
このようにエラーの箇所の直前でリストを定義すればエラーは消えましたが、シミュレーターではPickerViewに
何も表示されません。やはりドラムロールにタイトルが設定されていないのだと思います。¥コピペのため「list[row]」の意味もよく理解していない状態ですが、エラーの解決方法を教えていただきたいです。
よろしくお願いします。
追記
} extension ViewController : UIPickerViewDelegate, UIPickerViewDataSource {
真ん中のこの部分を消してclassとextensionをくっつけてみました。
エラーは消えたもののドラムロールに何も表示されないことに変わりはありません。
補足情報(FW/ツールのバージョンなど)
Xcode Version 11.3.1 (11C504)
Swift 5
MacOS 10.15.2
iOS 13.3 (シミュレーター環境)

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。