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

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

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

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

Q&A

1回答

626閲覧

Segmented controlが選んだ項目をタイトルやラベルに表示する方法

Tomzy

総合スコア104

Swift

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

0グッド

0クリップ

投稿2019/05/07 06:01

編集2019/05/16 08:40

複数のSegmented controlを設定して、選ばれた項目をナビゲーションバーのタイトルやラベルに表示させることは出来ましたが、選択された画面が表示されず行き詰まっています。ご教示ください。⇨データーベースRealmのコードが残っていて不具合が発生していますので、Realmを完全に削除して作りなおしています。別の方法での質問を別途作りますのでこの質問は取り下げさせてください。

現れた現象

タイトルやラベルの表示そのものは出るのですが、segmented controlで選んだ項目が表示されず、初期設定の数字0が反映されて「リアルタイムバス時刻表」「日曜日」「往路」のみが表示されてしまいます。初期設定の数字を変えると表示は変わります。segmented controlの選択結果が反映されない不具合と思われます。

最初の質問時に間違ったコードの修正と下記回答を参考にコードを修正しました。

エラーは解消しましたが、上記不具合は解消されていません。

segmented controlを設定するクラス class JikokuDataModelのコードは修正していません。

// 時刻表用DB class JikokuDataModel: Object { //初期設定数字 @objc dynamic var id = 0 @objc dynamic var jikokuShuruiSeg = 0  //ここの数字を変えると表示が変わる @objc dynamic var youbiSeg = 0      //ここの数字を変えると表示が変わる @objc dynamic var oufukuSeg = 0     //ここの数字を変えると表示が変わる @objc dynamic var textEkimei = "" @objc dynamic var textHoumen = "" @objc dynamic var textURL = "" @objc dynamic var jikokuHyouImage: Data? @objc dynamic var category = 0 // idをプライマリキーに設定 override static func primaryKey() -> String? { return "id" } enum JikokuDataJikokuShuruiSeg: Int { case realBus case busTime case railTime case otherTime } enum JikokuDataYoubiSeg: Int { case sunday case saturday case sunSatday case monFriday } enum JikokuDataOufukuSeg: Int { case outward case fukuro case other }

segmented controlを設定した画面のTorikomiSetteiViewController.swiftのコードは関係ないコードは削除してコードを修正しました。

class TorikomiSetteiViewController: UIViewController, UITextFieldDelegate, WKUIDelegate, WKNavigationDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, GADBannerViewDelegate { //segmented controlとラベルの宣言 @IBOutlet weak var jikokuShuruiSeg: UISegmentedControl! @IBOutlet weak var youbiSeg: UISegmentedControl! @IBOutlet weak var oufukuSeg: UISegmentedControl! @IBOutlet weak var textEkimei: UITextField! @IBOutlet weak var textHoumen: UITextField! //データを保存して他の画面に複写する準備 var jikokuhyouIchijikiroku: JikokuDataModel? override func viewDidLoad() { super.viewDidLoad() textEkimei.delegate = self as UITextFieldDelegate print("ここまで来たうウェブ画面での保存データ", jikokuDataModel) //ウエブサイトGoogleのボタンが押されたときのデータの隣への移送と画面遷移 @IBAction func webSiteGoogle(_ sender: Any) { print("ここまできたwebSiteGoogleボタンが押された") // モデルクラスをインスタンス化 let jikokuDataModel = JikokuDataModel() //segmented controlの選択数値を取得 jikokuDataModel.jikokuShuruiSeg = jikokuShuruiSeg.selectedSegmentIndex jikokuDataModel.youbiSeg = youbiSeg.selectedSegmentIndex jikokuDataModel.oufukuSeg = oufukuSeg.selectedSegmentIndex //テキストフィールドの名前を取得 jikokuDataModel.textEkimei = self.textEkimei.text! jikokuDataModel.textHoumen = self.textHoumen.text! print("ここまで来たデータの読み込み", jikokuDataModel) //ここで移動先のstoryboardを選択 let storyboard: UIStoryboard = self.storyboard! let webSiteGoogle = storyboard.instantiateViewController(withIdentifier: "webSiteGoogle") as! TorikomiWebViewController //jikokuDataModelをwebSiteGoogle画面に移す webSiteGoogle.jikokuhyouIchijikiroku = jikokuDataModel navigationController?.pushViewController(webSiteGoogle, animated: true) print("ここまできたwebSiteGoogle画面への遷移") }

上記のGoogleボタンにより遷移する画面コードを修正(segmented controlの選択結果を表示する画面TorikomiWebViewController.swift)

class TorikomiWebViewController: UIViewController, RealmPrimaryKeyIncrementerProtocol, WKUIDelegate, UINavigationControllerDelegate, WKNavigationDelegate, GADBannerViewDelegate { var jikokuhyouIchijikiroku:JikokuDataModel? @IBOutlet weak var navBar: UINavigationBar! @IBOutlet weak var webEkimei: UILabel! @IBOutlet weak var webHoumen: UILabel! @IBOutlet weak var webYoubi: UILabel! @IBOutlet weak var webOuFuku: UILabel! // モデルクラスをインスタンス化 let jikokuDataModel = JikokuDataModel() override func viewDidLoad() { super.viewDidLoad() print("ここまで来たウェブ画面での保存データ", jikokuDataModel)//この画面に遷移した時のデータを確認 //時刻表取得方法のsegmented controlによりナビゲーションバーのタイトルを表示 switch JikokuDataJikokuShuruiSeg(rawValue: jikokuDataModel.jikokuShuruiSeg)! { case .realBus: self.title = "リアルタイムバス時刻表" case .busTime: self.title = "バスストップ時刻表" case .railTime: self.title = "鉄道時刻表" case .otherTime: self.title = "その他時刻表" } //Labelに駅名を表示 webEkimei.text = jikokuhyouIchijikiroku?.textEkimei //Labelに方面を表示 webHoumen.text = jikokuhyouIchijikiroku?.textHoumen //ラベルに曜日を記載 switch JikokuDataYoubiSeg(rawValue: jikokuDataModel.youbiSeg)! { case .sunday: webYoubi.text = "日曜日" case .saturday: webYoubi.text = "土曜日" case .sunSatday: webYoubi.text = "日・土曜" case .monFriday: webYoubi.text = "月ー金曜" } //ラベルに往路・復路を記載 switch JikokuDataOufukuSeg(rawValue: jikokuDataModel.oufukuSeg)! { case .outward: webOuFuku.text = "往路" case .fukuro: webOuFuku.text = "復路" case .other: webOuFuku.text = "その他" }

エラー部分をコメントアウトしてビルドした時のスクリーンショット

設定画面のスクリーンショット

イメージ説明

上記Googleボタンで遷移した画面のタイトルとラベルが表示された。但し、いずれも初期値0

イメージ説明

初期設定数字を変えたスクリーンショット

イメージ説明

上記通り初期設定を変えた時のタイトルとラベルスクリーンショット

イメージ説明

ご参考事項

AAA
環境は下記のとおりです。
MacBook Pro (15-inch, 2016)
Mojave OS10.14.4
Xcode Version 10.2.1 (10E1001)
Swift4

BBB
この問題箇所は時刻表を取得する画面で、時刻表の種類、
曜日、往復路の区別をsegmented controlで指定し、
駅名と方面をテキストでインプットして、Google検索、ヤッフー検索、
カメラ、画像選択のボタンでそれぞれの画面に遷移するものです。

また、Google検索画面に遷移すると、それぞれ選択したものと
インプットしたものが表示される画面が現れます。

ヤッフー検索、カメラ、画像選択の画面でも同様な表示を
使います。

CCC
Google検索結果のURLと上記選択項目とインプット項目も
合わせてRealmデーターベースに取り込む予定をしていますが、
この段階ではRealmは使っていません。

DDD
設定画面におけるprint("ここまで来たデータの読み込み", jikokuDataModel)の表示は下記スクリーンショットのごとくsegmented controlを選んだとおり数字が示されます。
イメージ説明

EEE
しかし、ラベルを表示する画面での
print("ここまで来たウェブ画面での保存データ", jikokuDataModel)//この画面に遷移した時のデータを確認
の表示は、segmented controlを設定するクラス class JikokuDataModelで設定した初期の数字が反映されます。
0にすれば0と表示されます。
イメージ説明

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

全体を把握できていませんので断片的に。

swift

1self.jikokuShuruiSeg?[IndexPath.row]["jikokuShuruiSeg"] as? Int
  • jikokuShuruiSegは配列じゃないのに配列のようにアクセスしている。
  • IndexPath.rowとは?
  • ["jikokuShuruiSeg"]については全く意味不明。

SegmentedControlの選択番号は selectedSegmentIndex で取得します。

例えば、

swift

1jikokuDataModel.jikokuShuruiSeg = jikokuShuruiSeg.selectedSegmentIndex

のような感じでいけるんじゃないでしょうか?

TorikomiWebViewController

swift

1//viewDidLoadの中 2let jikokuDataModel = JikokuDataModel()

これでは初期値しか使われませんし、そもそもインスタンス変数のjikokuDataModelが使われないです。

投稿2019/05/07 06:15

編集2019/05/07 08:28
fuzzball

総合スコア16731

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

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

Tomzy

2019/05/07 07:03

早速レスポンスありがとうございました。 ご指摘のコードは、試行錯誤していた時のコードが紛れていました。 下記のコードに書き換えました。エラーはでませんが、結果は同じで、初期設定の数字が優先してしまいます。コードの挿入する場所が適当ではないのかも知れません。更に考えてみます。 //segmented controlの選択数値を取得 jikokuDataModel.jikokuShuruiSeg = jikokuShuruiSeg.selectedSegmentIndex jikokuDataModel.youbiSeg = jikokuShuruiSeg.selectedSegmentIndex jikokuDataModel.oufukuSeg = jikokuShuruiSeg.selectedSegmentIndex
fuzzball

2019/05/07 08:28

回答に追記しました。
Tomzy

2019/05/09 09:20

質問を書き直しましたので、ご教示ください。
fuzzball

2019/05/09 09:50

TorikomiSetteiViewController が TorikomiWebViewController に渡しているのは jikokuhyouIchijikiroku ですよ。jikokuDataModel じゃないです。 どちらが間違いなのか分かりませんが、どちらかを削除して統一して下さい。
Tomzy

2019/05/11 04:57

アドバイスありがとうございました。jikokuhyouIchijikirokuに統一すべく、まずは print("ここまで来たうウェブ画面での保存データ", jikokuhyouIchijikiroku)を記載したら選択した通りの数字が記録されました。他はコードのどこかが間違っているようで、期待通りの表示は得られいません。引き続きトライします。
Tomzy

2019/05/11 05:36

最初につくったRealm関係のコードが残っていて、正常に表示されない疑いが濃いことがわかりました。そこで、Realmを一切削除して別の方法で構築することにします。ありがとうございました。この質問は第三者に混乱を与えそうなのでしばらくしたら削除します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問