複数の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と表示されます。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/07 07:03
2019/05/07 08:28
2019/05/09 09:20
2019/05/09 09:50
2019/05/11 04:57
2019/05/11 05:36