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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,902
退会済みユーザー

退会済みユーザー

前提・実現したいこと

現在、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))して分岐させようとしたが、選択されている番号と違った数字が表示され上手くいかないので結果的に動的に変化させる事ができない。

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

現在のコード

import UIKit


class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource {

    var pickerView = UIPickerView()

    var label = UILabel()

    let todou = [ "東京都", "高知県", "香川県", "愛媛県"]

    let komakai = ["江戸川区", "江東区", "中央区", "荒川区"]

    let komakai2 = ["高知市", "四万十市", "安芸市", "なんとか市"]

    let komakai3 = ["松山市"]


    override func viewDidLoad() {
        super.viewDidLoad()

        // ViewContorller 背景色
        self.view.backgroundColor = UIColor(red: 0.92, green: 1.0, blue: 0.94, alpha: 1.0)

        // PickerView のサイズと位置
        pickerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 300)
        pickerView.backgroundColor = UIColor(red: 0.69, green: 0.93, blue: 0.9, alpha: 1.0)

        // PickerViewはスクリーンの中央に設定
        pickerView.center = self.view.center

        // Delegate設定
        pickerView.delegate = self
        pickerView.dataSource = self

        // Label 位置はPickerViewより150上に設定、高さを2行表示分とる
        let yPosition = pickerView.frame.origin.y
        label.frame = CGRect(x: 0, y: yPosition - 100, width: self.view.frame.width, height: 100)

        // ラベルを2行表示
        label.numberOfLines = 2
        label.text = "都道府県"
        // フォントサイズを大きく
        label.font = UIFont.systemFont(ofSize: 36)
        // テキストを中央寄せにする
        label.textAlignment = NSTextAlignment.center

        self.view.addSubview(pickerView)
        self.view.addSubview(label)
    }

    // UIPickerViewのコンポーネント(列)の数
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 2
    }

    // UIPickerViewの行数、リストの数
    //配列の数をカウントして表示する、必須
    func pickerView(_ pickerView: UIPickerView,
                    numberOfRowsInComponent component: Int) -> Int {
        if (component == 0){
            return todou.count
        }
        else if (component == 1){
            return komakai.count
        }
        return 0;
    }
    // UIPickerViewの最初の表示
    //その都度呼び出し
    func pickerView(_ pickerView: UIPickerView,
                    titleForRow row: Int,
                    forComponent component: Int) -> String? {
        if (component == 0){
            return todou[row]
            }
        else if (component == 1){
            return komakai[row]
        }
        return "";

    }

    // UIPickerViewのRowが選択された時の挙動
    func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int, inComponent component: Int) {
        var comNum = 0
        //現在選択されているコンポーネント番号取得
        comNum = pickerView.selectedRow(inComponent: 0)
        label.text = todou[row]
        switch comNum {
        case 1:
            print("更新")
            pickerView.reloadComponent(1)
        default:
            print("default")
        }

    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2019/04/03 09:20 編集

    可能かどうか答えればいいんでしょうか?

    やったことはないですが、出来ない理由が思い浮かばないので、コードを載せて、現在何が問題になっているかを書いた方がいいです。もしかすると、あなたのやりたいことが伝わってないかも知れません。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/04/03 09:50

    お返事頂きありがとうございます。

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

    キャンセル

回答 1

checkベストアンサー

+1

なかなか上手く行かず

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/03 20:37

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

    キャンセル

  • 2019/04/03 21:21

    目指しているものとほとんど同じものが記事でありました、https://medium.com/@smehta/ios-swift-creating-a-dynamic-picker-view-843b3290e7f0

    この記事を見る限りでは動的に変化させていると記述してありました。

    キャンセル

  • 2019/04/04 01:25 編集

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

    ちなみにTableViewやCollectionViewなども同じような仕組みです。

    キャンセル

  • 2019/04/04 17:38

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

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Xcodeに関する質問
  • swift、Pickerviewで一つめのcompornentの選択内容に応じて二つの目のcompornent表示を切り替える方法