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

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

ただいまの
回答率

90.12%

選択したテキストフィールドの値によって次のテキストフィールドで取得できる値を変える方法を押してください

受付中

回答 1

投稿 編集

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

退会済みユーザー

rosennameTextFieldで選択した新幹線の路線名によって
stationnameTextFieldで選択できる駅名を変える方法を教えてください。
東北新幹線なら["東京","上野","大宮","小山"]
上越新幹線なら["東京","上野","大宮","熊谷"]
東海道新幹線なら["東京","品川","新横浜"]
といった感じです。

ネットで調べながら進めてきましたが、データの取得の方法がわかりません。
よろしくお願いいたします。

import UIKit

class ViewController: UIViewController,UIPickerViewDelegate,
UIPickerViewDataSource{

@IBOutlet weak var rosennameTextField: UITextField!
@IBOutlet weak var stationnameTextField: UITextField!
let rosenname = ["東北新幹線","上越新幹線","東海道新幹線"]
let stationname = ["東京","上野"]

override func viewDidLoad() {
super.viewDidLoad()

let rosennamePickerView = UIPickerView()

rosennamePickerView.delegate = self

rosennamePickerView.tag = 1

rosennameTextField.inputView = rosennamePickerView

let stationnamePickerView = UIPickerView()

stationnamePickerView.delegate = self

stationnamePickerView.tag = 2

stationnameTextField.inputView = stationnamePickerView

// Do any additional setup after loading the view.
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
if pickerView.tag == 1 {
return rosenname.count
}
else if pickerView.tag == 2 {
return stationname.count
}
return 0
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
if pickerView.tag == 1 {
return rosenname[row]
}
else if pickerView.tag == 2 {
return stationname[row]
}
return nil
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if pickerView.tag == 1 {
rosennameTextField.text = rosenname[row]
}
else if pickerView.tag == 2 {
stationnameTextField.text = stationname[row]
}
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
view.endEditing(true)
}
}
【追記】
以下のようにしてみましたが

import UIKit

class ViewController: UIViewController,UIPickerViewDelegate,
UIPickerViewDataSource{

    @IBOutlet weak var rosennameTextField: UITextField!
    @IBOutlet weak var stationnameTextField: UITextField!
    let rosenname = ["東北新幹線","上越新幹線","東海道新幹線"]
    let stationname:[String:[String]] =
        [
            "東北新幹線":["","東京","上野","大宮","小山","宇都宮","那須塩原","新白河","郡山"],
            "上越新幹線":["","東京","上野","大宮","熊谷","高崎"],
            "東海道新幹線":["","東京","品川","新横浜"]
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        let rosennamePickerView = UIPickerView()

        rosennamePickerView.delegate = self

        rosennamePickerView.tag = 1

        rosennameTextField.inputView = rosennamePickerView

        let stationnamePickerView = UIPickerView()

        stationnamePickerView.delegate = self

        stationnamePickerView.tag = 2

        stationnameTextField.inputView = stationnamePickerView

        // Do any additional setup after loading the view.
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 1 {
            return rosenname.count
        }
        else if pickerView.tag == 2 {
            return stationname.count
        }
        return 0
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 1 {
            return rosenname[row]
    }
        else if pickerView.tag == 2 {
            **return stationname[row]**
    }
        return nil
}
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 1 {
            rosennameTextField.text = rosenname[row]
        }
        else if pickerView.tag == 2 {
            stationnameTextField.text = **stationname[row]**
//Cannot subscript a value of type '[String : [String]]' with an index of type 'Int'
というエラーが出てしまいます。
       }
}
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

ざっくりと以下の様な感じでできませんか。

  1. 駅名配列を路線数分用意する。例) stationTohoku, stationTokaido, ...
  2. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    と、
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
    において、pickerView.tag == 2の場合のreturnを、rosennamePickerViewの選択項目に対応する1.で作成した駅名配列から作成する。

※1つ前の質問でも指摘されていますが、ソースコードは```で囲んでください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/06 13:57

    まずは、元のstationname がどのように利用されているか把握してください。
    具体的には、どんな画面を操作したときに下記funcがどのように呼ばれているかを確認してください。
    func numberOfComponents(in pickerView: UIPickerView)
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int)
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int)
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

    また、今のコードの stationname では、
    let name: String = stationname["東北新幹線"][row]
    といった使い方になります。

    キャンセル

  • 2019/06/06 18:35

    色々とヒントを出していただいたにも関わらず、こちらのレベルが低すぎて申し訳ありません。
    まったくおっしゃっている事がわかりません。
    参考書やyou tube等で初歩的なことをみようみまねでやってますが、それにちょっと変化を加えたりすると意味がわからなくなります。
    再度、基本からやってみます。
    色々とありがとうございました

    キャンセル

  • 2019/06/06 18:45

    基本的なことですが、まずはログの出力から行ってください。
    簡単なのは、print("メッセージ")をfunc viewDidload内に埋め込み、XcodeのConsoleAreaに"メッセージ"が表示されることを確認してください。
    そして、各funcや条件分岐の発生箇所にprintを追加し、どの順番で処理が実行されているかを確認してください。

    また、UIPickerViewDelegateやUIPickerViewDataSourceがどういう役割をしているかを調べてください。
    それぞれのクラスが何をしているのかをざっくりとでも把握しないと先に進めません。

    頑張ってください。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Xcodeに関する質問
  • 選択したテキストフィールドの値によって次のテキストフィールドで取得できる値を変える方法を押してください