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

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

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

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

Q&A

解決済

1回答

461閲覧

Swift 2つ先の値渡しについて

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/08/12 23:41

編集2021/09/29 02:16

今pickerで取得したデータを二つ先のviewcontrollerに値渡しをしたい状況です。

swift

1import UIKit 2 3class secondViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { 4 5 @IBOutlet weak var seibetupicker: UIPickerView! 6 @IBOutlet weak var agepicker: UIPickerView! 7 8 let seibetudataList = ["男性","女性","不明","指定なし"] 9 let agedataList = ["10代","20代","30代","40代","50代","60代","70代","80代","90代"] 10 11 var selectedSeibetu: String? 12 13 override func viewDidLoad() { 14 super.viewDidLoad() 15 seibetupicker.delegate = self 16 seibetupicker.dataSource = self 17 agepicker.delegate = self 18 agepicker.dataSource = self 19 // Do any additional setup after loading the view. 20 } 21 22 override func didReceiveMemoryWarning() { 23 super.didReceiveMemoryWarning() 24 25 agepicker.numberOfRows(inComponent: 0) 26 // Dispose of any resources that can be recreated. 27 } 28 func numberOfComponents(in pickerView: UIPickerView) -> Int { 29 // 表示する列数 30 return 1 31 } 32 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 33 // アイテム表示個数を返す 34 if pickerView == agepicker { 35 // 1個目のピッカーの設定 36 return agedataList.count 37 }else{ 38 return seibetudataList.count 39 } 40 return agedataList.count 41 } 42 // UIPickerViewDelegate 43 44 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 45 // 表示する文字列を返す 46 if pickerView == agepicker { 47 // 1個目のピッカーの設定 48 return agedataList[row] 49 }else { 50 return seibetudataList[row] 51 } 52 return agedataList[row] 53 } 54 55 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 56 if pickerView == seibetupicker { 57 selectedSeibetu = seibetudataList[row] 58 } 59 } 60 61 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 62 if segue.identifier == "ViewController" { 63 let ViewController:ViewController = segue.destination as! ViewController 64 if (selectedSeibetu == "男性"){ 65 ViewController.Datalist = 0 66 }else{ 67 ViewController.Datalist = 1 68 } 69 } 70 } 71
import UIKit class ViewController: UIViewController,UITextFieldDelegate { @IBOutlet weak var yourlavel: UILabel! @IBOutlet weak var textfield: UITextField! @IBOutlet weak var imageView: UIImageView! @IBAction func ageback(_ sender: Any) { self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) } @IBAction func pictureback(_ sender: Any) { self.dismiss(animated: true, completion: nil) } // 選択肢 var Datalist:Int = 0 override func viewDidLoad() { super.viewDidLoad() print(Datalist) if Datalist == 0 { self.view.backgroundColor = UIColor (patternImage: UIImage(named: "vacation")!) } else{self.view.backgroundColor = UIColor(patternImage: UIImage(named: "nighthanabi")!) } // Do any additional setup after loading the view, typically from a nib. yourlavel.text = "" self.imageView.image = image } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }

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

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

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

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

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

xAxis

2018/08/13 01:19

SecondViewControllerからViewControllerに直接segueで接続する、というやり方は既に検討済みなのでしょうか?
t_obara

2018/08/13 02:11

そもそもViewControllerへのキャストで良いのですか?識別子がsecondViewControllerなのであればSecondViewControllerへのキャストになるのでは?エラーメッセージだとThirdViewControllerからキャストできないとなっていますので、もう少し整理して考えてみてはいかがでしょうか。必要最小限のコードで動作を確認してみるとか。
退会済みユーザー

退会済みユーザー

2018/08/13 03:32

直接接続は試しているのですがそのコードが読み込まれず、ブレイクポイントを試しましたが駄目でした
退会済みユーザー

退会済みユーザー

2018/08/13 03:35

t_obara様 すいません キャストとはどうすればできるのでしょうか 教えてくださいませ よろしくお願いします
t_obara

2018/08/13 03:41

as! の部分です。
xAxis

2018/08/13 03:47

あーほんとだ。identifierがsecondViewControllerだからsecondViewControllerにキャストしないと識別子を取り違えてない限り失敗しますね。
xAxis

2018/08/13 03:49 編集

あとsegueがどんな感じに接続されてるか見てみないとなんとも言えないですね。プラスαコードも。
退会済みユーザー

退会済みユーザー

2018/08/13 08:37

xAxis様 どのコードを追加したらよろしいのでしょうか? segue関連のコードは全て追加してあげるべきですかね...
退会済みユーザー

退会済みユーザー

2018/08/13 08:59 編集

asの先の部分をviewcotrollerにしたのですがhas no segue with identifier 'ViewControllerこういうエラーが出てしまいました
xAxis

2018/08/13 09:44

質問に関わる部分は全て上げると回答率も上がるんじゃないかと。あとキャストはsecondViewController以外では無理じゃないかなーと推測します。
退会済みユーザー

退会済みユーザー

2018/08/13 10:24

分かりました。なぜ無理だと思ったのでしょうか?
xAxis

2018/08/13 10:32

prepare関数内においてsegue.identifier == "secondViewController"という条件がありますね。この中の識別子は大抵segue.destinationまたはsegue.sourceのクラス名と同一にします。つまりこのコードから推測出来る事はsegueの接続先のクラス名はsecondViewControllerではないかという事です。他にも作成されたクラス名はViewController、secondViewController、ThirdViewControllerというものがあるだろうと推測出来ます。がsegueの接続のされ方は全てを推測出来る訳ではありません。なので質問に答えるためには他の情報が必要になる、つまりコードやsegueの接続の仕方がどうなっているか知りたいのです。
xAxis

2018/08/13 10:42 編集

ちなみにあくまで推測です。エラーを見る限りではsegueの接続先はThirdViewControllerのようですし。色々ごちゃごちゃになってるんじゃないかなと思います。んで、推測で物を言うのは限度があるんです。それに推測するのにもエネルギーを消費します。でも最初からコードやstoryboardの状態が分かれば無用な推測をする必要が無いわけです。だから質問をする時のテンプレートには該当するソースコードを貼る為の欄が用意されているだと思いますよ。
退会済みユーザー

退会済みユーザー

2018/08/13 11:35

xAxis様 コードを追加しました
xAxis

2018/08/13 16:17

うん。。。まぁこれじゃ分かんないよね。
xAxis

2018/08/13 16:19

誰か答えてくれる人が見つかるといいですね。
退会済みユーザー

退会済みユーザー

2018/08/13 21:22

そうですね。
t_obara

2018/08/14 01:15

ちなみに、二画面では実現できているのですか?まずはそちらで確認されてはいかがでしょうか。また、元画面と遷移先画面のUIViewControllerがそれぞれ何かを提示されないと正確に指摘することが難しいかと思います。
退会済みユーザー

退会済みユーザー

2018/08/14 01:45

t_obara様 二画面での実現とはどういうことなのでしょうか。 コードを全て追加しましたので確認の方をよろしくおねがいします。
guest

回答1

0

ベストアンサー

storyboard見てないから憶測で。

ThirdViewController内に変数DataListを宣言して0を代入。

次はsecondViewController内のprepare関数をThirdViewControllerに遷移するように書き換える。

swift

1 if segue.identifier == "ThirdViewController" { 2 guard let thirdVC = segue.destination as? ThirdViewController else { 3 fatalError() 4 } 5 if (selectedSeibetu == "男性"){ 6 thirdVC.DataList = 0 7 }else{ 8 thirdVC.DataList = 1 9 } 10 }

こんな感じで大丈夫でしょう。

んでStoryboard上でsecondViewConrollerからThirdViewControllerに接続されているsegueのidentifierをThirdViewControllerに設定。

最後にThirdViewController内のprepare関数の書き換え。今度は

swift

1 guard let VC = segue.destination as? ViewController else { 2 fatalError() 3 } 4 VC.image = self.imageView.image 5 VC.DataList = self.DataList

これでsecondViewControllerからThirdViewControllerを通じてViewControllerにDataListの値渡しが出来るのではないかと。

エラーが出たら回答の方の追記に。

投稿2018/08/14 02:18

編集2018/08/14 07:06
xAxis

総合スコア1349

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

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

退会済みユーザー

退会済みユーザー

2018/08/14 06:55 編集

Type 'ThirdViewController' has no member 'DataList' というエラーがsecondviewcontroller内での ThirdViewController.DataList = 0にて 発生しました。 さらに上の写真のエラーも出ています。
xAxis

2018/08/14 06:55

>ThirdViewController内に変数DataListを宣言して0を代入 これちゃんと書いてますか?
退会済みユーザー

退会済みユーザー

2018/08/14 06:58

var Datalist:Int = 0は書いてあります。
xAxis

2018/08/14 06:58

上記のエラー画像はそもそも書く場所が違います。 >ThirdViewController内のprepare関数の書き換え です。
xAxis

2018/08/14 07:08 編集

> Type 'ThirdViewController' has no member 'DataList' これはThirdViewContollerに変数DataListがないことを示しています。 それと定数名をThirdViewControllerとするとクラス名と被るのでthirdViewControllerとするとかthirdVCとするとかにした方がいいです。定数名を変更してもまだエラーが出るなら教えてください。
xAxis

2018/08/14 07:12

さっき自分の回答の方も間違っていたので修正しましたが定数、変数、関数名はfillWith(){}のように小文字から初めて、クラス名はViewControllerの様に大文字から始めるのが慣習です。こういう慣習を守ることはバグの減少にもつながるのできっちり守った方が良いです。
退会済みユーザー

退会済みユーザー

2018/08/14 07:13

定数名を変えたことでビルドはうまくいったのですがViewController二画面遷移する前にhas no segue with identifier 'ViewControllerというエラーが出てしまいました。
退会済みユーザー

退会済みユーザー

2018/08/14 07:13

xAxis様 ご指摘ありがとうございます。
xAxis

2018/08/14 07:16

ThirdViewControllerからViewControllerはsegueで接続していますか?
退会済みユーザー

退会済みユーザー

2018/08/14 07:21 編集

xAxis様 接続しています。 Storyboardの写真を追加しました。
xAxis

2018/08/14 07:22

であれば次の確認は識別子ですね。StoryboardでThirdViewControllerからViewControllerへ接続しているsegueにViewControllerという識別子が設定されているか確認してみましょう。
退会済みユーザー

退会済みユーザー

2018/08/14 07:26

識別子を追加したところアラートが表示されなくなってしまいました、
xAxis

2018/08/14 07:27

画像確認しました。この感じだとUIButtonとViewControllerを接続している様に見えるのですがそれであってますか?もしその接続で間違いないなら、やるべき事はThirdViewControllerとViewControllerの接続ですね。つまり二つのViewControllerを接続するわけです。
退会済みユーザー

退会済みユーザー

2018/08/14 08:00 編集

すいません。アラートも表示され接続もうまくいくようになったのですが背景が変わらなくなってしまいました。男性をピッカーで選んでもelseの1が出力されてしまっているのですがどうしてなのでしょうか。
xAxis

2018/08/14 08:00

とりあえず落ち着いて。 何の背景なのか、そしてelseの1とはどこの事なのか説明してください。
退会済みユーザー

退会済みユーザー

2018/08/14 08:03

xAxis様 ViewControllerの背景です。 secondViewControllerの男性を選んだ時はvacationという写真が出力されるがはずなのですがそれがnighthanabiという写真が出力されてしまいます(今の状況)
退会済みユーザー

退会済みユーザー

2018/08/14 08:10

seibetudataList = ["男性","女性","不明","指定なし"]で男性の0番目を選択するとvacationでそれ以外はnighthanabiを出力したいのです。それが男性を選んでもnighthanabiが出力されてしまい、困っている状況です。
xAxis

2018/08/14 08:19 編集

あーこれはUIPickerViewのrowをいつ取るか、という問題ですね。pickerView(_:,didSelectRow:, inComponent:)で選択されたrowを取ろうとすると挙動が不安定になりがちです。なのでこの関数を使わずにprepare関数内でpicker.selectedRow(inComponent:)関数を使ってみてください。こちらの方が確実に選択されたrowを得ることが出来ます。コードを読む限りcomponentは1で大丈夫でしょう。というわけでこんな感じにprepare関数内のif文書き換えです。 guard let thirdVC = segue.destination as? ThirdViewController else { fatalError() } let seibetu = seibetuPicker.selectedRow(inComponent: 1) if (seibetu == 0){ thirdVC.DataList = 0 }else{ thirdVC.DataList = 1 }
xAxis

2018/08/14 08:18

本来なら質問を分けた方がいいのですけどね。
退会済みユーザー

退会済みユーザー

2018/08/14 08:20

書き換えましたところ、index 1 beyond bounds [0 .. 0]'エラーが出てしまったのですが、、
xAxis

2018/08/14 08:23

あれ?じゃあpicker.selectedRow(inComponent:0)かな?
退会済みユーザー

退会済みユーザー

2018/08/14 08:28

xAxis様 直りました。ありがとうございます。 本当にご迷惑等をおかけして申し訳ございませんでした。これからはコード等は最初からきちんと書いておきたいと思います。これからもお世話になることがあるかもしれませんがよろしくお願い申し上げます。
xAxis

2018/08/14 08:42

そういやcomponentはrowと同じで0番目からでしたね。失礼しました。 >これからはコード等は最初からきちんと書いておきたいと思います。 これすごく大事です。それを自身で気付かれたことは素晴らしいことです。 私自身、kai1098さんがコードを回答に上げられてから解決するまでのエネルギーよりも推測で物を言うエネルギーの方がはるかに大きいんですね。仮に私自身の事は完全において置くとしても、質問開始から解決まで30時間ちょいかかっちゃいましたが(これは夜も含んじゃってますけども)、コードを追加されてから解決までは7時間で済んでます。時間だけ見ても約1/4です。kai1098さんもそれだけ少ない時間で解決まで進められます。 なので最初からコードを上げる、そして出せる情報は全部出す、というのはとっても大事です。 私の答えられる範囲でしたらまたどうぞ。私の答えられないことでも上記の事を徹底すればきっとどなたかが答えてくれますよ。 最後に >誰か答えてくれる人が見つかるといいですね。 これは本当に嫌な言い方でしたね。すいませんでした。以後気をつけます。
退会済みユーザー

退会済みユーザー

2018/08/14 09:42

xAxis様 これからもよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問