質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3254閲覧

swift、Pickerviewで一つめのcompornentの選択内容に応じて二つの目のcompornent表示を切り替える方法

退会済みユーザー

退会済みユーザー

総合スコア0

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/04/02 10:48

編集2019/04/03 14:22

前提・実現したいこと

現在、swiftを用いて、PickerViewのドラムロールで都道府県と細かい市区町村を選択できるようなシステムを作っているのですが、なかなか上手く行かず苦戦している状況で、まずそもそも今現在やろうとしている方法が実現可能かどうかがわからなくなってきたので分かる方がいらしたらご教授願います。

Pickerviewのドラムロールのcompornent0で大まかな場所(都道府県)、それを選択するとcompornent1に、都道府県に対応した市区町村が出てきて選択可能状態になる。

という様なものを目指しているのですが、可能がどうか分かる方がいらしたらよろしくお願いします。

目指している形
https://medium.com/@smehta/ios-swift-creating-a-dynamic-picker-view-843b3290e7f0

初めての質問なので足りない部分があったらすみません。

**4/3 23:11 結果的に質問したい事がわからないのでアドバイスができないという指摘を受けてコードを修正+わからない事を箇条書きにしました。

**
わからない部分
①コンポーネント番号取得まではできたが、そこからその番号を用いて分岐させたいが、どう動的に変化させるかがわからない
②表示を司る部分
func pickerView(_ pickerView: UIPickerView,
titleForRow row: Int,
forComponent component: Int) -> String? {}
この関数内で現在選ばれているコンポーネント番号を取得(comNum = pickerView.selectedRow(inComponent: 0))して分岐させようとしたが、選択されている番号と違った数字が表示され上手くいかないので結果的に動的に変化させる事ができない。

わかりづらい説明ですみませんが分かる方いらしたらよろしくお願いします。

現在のコード

swift

1 2import UIKit 3 4 5class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource { 6 7 var pickerView = UIPickerView() 8 9 var label = UILabel() 10 11 let todou = [ "東京都", "高知県", "香川県", "愛媛県"] 12 13 let komakai = ["江戸川区", "江東区", "中央区", "荒川区"] 14 15 let komakai2 = ["高知市", "四万十市", "安芸市", "なんとか市"] 16 17 let komakai3 = ["松山市"] 18 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 23 // ViewContorller 背景色 24 self.view.backgroundColor = UIColor(red: 0.92, green: 1.0, blue: 0.94, alpha: 1.0) 25 26 // PickerView のサイズと位置 27 pickerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 300) 28 pickerView.backgroundColor = UIColor(red: 0.69, green: 0.93, blue: 0.9, alpha: 1.0) 29 30 // PickerViewはスクリーンの中央に設定 31 pickerView.center = self.view.center 32 33 // Delegate設定 34 pickerView.delegate = self 35 pickerView.dataSource = self 36 37 // Label 位置はPickerViewより150上に設定、高さを2行表示分とる 38 let yPosition = pickerView.frame.origin.y 39 label.frame = CGRect(x: 0, y: yPosition - 100, width: self.view.frame.width, height: 100) 40 41 // ラベルを2行表示 42 label.numberOfLines = 2 43 label.text = "都道府県" 44 // フォントサイズを大きく 45 label.font = UIFont.systemFont(ofSize: 36) 46 // テキストを中央寄せにする 47 label.textAlignment = NSTextAlignment.center 48 49 self.view.addSubview(pickerView) 50 self.view.addSubview(label) 51 } 52 53 // UIPickerViewのコンポーネント(列)の数 54 func numberOfComponents(in pickerView: UIPickerView) -> Int { 55 return 2 56 } 57 58 // UIPickerViewの行数、リストの数 59 //配列の数をカウントして表示する、必須 60 func pickerView(_ pickerView: UIPickerView, 61 numberOfRowsInComponent component: Int) -> Int { 62 if (component == 0){ 63 return todou.count 64 } 65 else if (component == 1){ 66 return komakai.count 67 } 68 return 0; 69 } 70 // UIPickerViewの最初の表示 71 //その都度呼び出し 72 func pickerView(_ pickerView: UIPickerView, 73 titleForRow row: Int, 74 forComponent component: Int) -> String? { 75 if (component == 0){ 76 return todou[row] 77 } 78 else if (component == 1){ 79 return komakai[row] 80 } 81 return ""; 82 83 } 84 85 // UIPickerViewのRowが選択された時の挙動 86 func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int, inComponent component: Int) { 87 var comNum = 0 88 //現在選択されているコンポーネント番号取得 89 comNum = pickerView.selectedRow(inComponent: 0) 90 label.text = todou[row] 91 switch comNum { 92 case 1: 93 print("更新") 94 pickerView.reloadComponent(1) 95 default: 96 print("default") 97 } 98 99 } 100 101}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2019/04/03 00:24 編集

可能かどうか答えればいいんでしょうか? やったことはないですが、出来ない理由が思い浮かばないので、コードを載せて、現在何が問題になっているかを書いた方がいいです。もしかすると、あなたのやりたいことが伝わってないかも知れません。
退会済みユーザー

退会済みユーザー

2019/04/03 00:50

お返事頂きありがとうございます。 ちょっとコードも載せてみます。 アドバイスありがとうございます。
guest

回答1

0

ベストアンサー

なかなか上手く行かず

これでは、こちらとしては、何が上手くいかないのか、何が分からないのかが分かりません。

compornent0(一列目)のどれにカーソルがあたっているのかが分かる方法があれば知りたいです。

ここまで分かっているなら、ドキュメントを読んでいれば解決出来る問題です。
selectedRow(inComponent:) で取得できます。

UIPickerView とか UIPickerViewDataSource は一通り目を通しておきましょう。

投稿2019/04/03 01:30

編集2019/04/03 01:48
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/04/03 11:37

回答頂きありがとうございます、そうですね、よくわからない質問になってしまいまして申し訳ありません。 最初からPickerviewに読み込ませて表示させているか、それとも選択されたものを検出して動的にcomponent1の表示を切り替えるのかがわからないです。 カーソルが当たっている番号を取得まではできました、ありがとうございます。
fuzzball

2019/04/04 09:02 編集

仕組みをよく考えれば、切り替える処理を追加する必要がないことに気が付くと思います。 すでに pickerView(_:titleForRow:forComponent:) で動的に切り替わるようになってますよね? あとは表示を更新するだけです。 ちなみにTableViewやCollectionViewなども同じような仕組みです。
退会済みユーザー

退会済みユーザー

2019/04/04 08:38

リファレンスを読み直したり、関数の動きを考えたらできました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問