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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1825閲覧

iOS UIPickerViewとUISegmentedControlを用いたTableView

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/04/07 17:56

編集2018/04/08 17:32

前提・実現したいこと

xcodeで以下の写真のようなタイムテーブルを作ろうとしています。PickerViewで場所を選択、SegmentedControlで日時を選択し、それに合ったtableviewを表示するというようにしたいです。

イメージ説明

しかし、エラーは一切出ないでBuildできるにも関わらず、tableviewに何も表示されません。
また、SegmentedControlをタップすると、Thread 1: signal SIGABRTがAppDelegateに出てしまいます。どのように書き換えたらよいでしょうか。

コード全体

EventViewController.swift

1 2import UIKit 3 4class EventViewController: UIViewController 5 , UIPickerViewDelegate, UIPickerViewDataSource 6 , UITableViewDelegate, UITableViewDataSource 7{ 8 var pickerView: UIPickerView = UIPickerView() 9 let list = ["1", "2"] 10 var place = String() 11 var date = String() 12 13 //StoryBoardでは基本的に設定を変えていません。タグを変えたぐらいです。 14 15 @IBOutlet weak var textField: UITextField! 16 @IBOutlet var timetable: UITableView! 17 @IBAction func daysegment(sender: UISegmentedControl) { 18 19 switch sender.selectedSegmentIndex { 20 case 0: 21 date = "Day1" 22 case 1: 23 date = "Day2" 24 default: 25 break 26 } 27 } 28 29 30 //写真array 31 let place1imgArrayDay1: NSArray = [ 32 "","","","","" 33 ] 34 let place2imgArrayDay1: NSArray = [ 35 "","","","","" 36 ] 37 let place1imgArrayDay2: NSArray = [ 38 "","","" 39 ] 40 let place2imgArrayDay2: NSArray = [ 41 "","","","" 42 ] 43 44 //nameラベルarray 45 let place1nameArrayDay1: NSArray = [ 46 "","","","","" 47 ] 48 let place2nameArrayDay1: NSArray = [ 49 "","","","","" 50 ] 51 let place1nameArrayDay2: NSArray = [ 52 "","","" 53 ] 54 let place2nameArrayDay2: NSArray = [ 55 "","","","" 56 ] 57 58 //timeラベルarray 59 let place1timeArrayDay1: NSArray = [ 60 "","","","","" 61 ] 62 let place2timeArrayDay1: NSArray = [ 63 "","","","","" 64 ] 65 let place1timeArrayDay2: NSArray = [ 66 "","","" 67 ] 68 let place2timeArrayDay2: NSArray = [ 69 "","","","" 70 ] 71 72//実際は画像、ラベルが入っています。 73 74 75 override func viewDidLoad() { 76 super.viewDidLoad() 77 78 pickerView.delegate = self 79 pickerView.dataSource = self 80 pickerView.showsSelectionIndicator = true 81 82 let toolbar = UIToolbar(frame: CGRectMake(0, 0, 0, 35)) 83 let doneItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(EventViewController.done)) 84 toolbar.setItems([doneItem], animated: true) 85 86 self.textField.inputView = pickerView 87 self.textField.inputAccessoryView = toolbar 88 self.textField.text = list[0] 89     self.timetable.dataSource = self 90 self.timetable.delegate = self 91 } 92 93 func numberOfComponents(in pickerView: UIPickerView) -> Int { 94 return 1 95 } 96 97 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 98 return list.count 99 } 100 101 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 102 return list[row] 103 } 104 105 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 106 self.textField.text = list[row] 107 } 108 109 @objc func done() { 110 self.textField.endEditing(true) 111 place = textField.text! 112 } 113 114 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 115 return CGRect(x: x, y: y, width: width, height: height) 116 } 117 118 func tableView(_ table: UITableView, 119 numberOfRowsInSection section: Int) -> Int { 120 121 if place == "1", date == "Day1" { 122 return place1imgArrayDay1.count 123 }else if place == "2", date == "Day1" { 124 return place2imgArrayDay1.count 125 }else if place == "1", date == "Day2" { 126 return place1imgArrayDay2.count 127 }else if place == "2", date == "Day2" { 128 return place2imgArrayDay2.count 129 }else { 130 131 } 132 return place1imgArrayDay1.count 133 } 134 func tableView(_ timetable: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 135 136 let cell = timetable.dequeueReusableCell(withIdentifier: "tableCell",for: indexPath) 137 cell.selectionStyle = UITableViewCellSelectionStyle.none 138 139 if place == "1", date == "Day1" { 140 let img = UIImage(named: place1imgArrayDay1[indexPath.row] as! String) 141 142 let imageView = cell.viewWithTag(1) as! UIImageView 143 imageView.image = img 144 145 let label1 = cell.viewWithTag(2) as! UILabel 146 label1.text = String(describing: place1nameArrayDay1[indexPath.row]) 147 label1.adjustsFontSizeToFitWidth = true 148 149 let label2 = cell.viewWithTag(3) as! UILabel 150 label2.text = String(describing: place1timeArrayDay1[indexPath.row]) 151 label2.adjustsFontSizeToFitWidth = true 152 }else if place == "1", date == "Day2" { 153 let img = UIImage(named: place1imgArrayDay2[indexPath.row] as! String) 154 155 let imageView = cell.viewWithTag(1) as! UIImageView 156 imageView.image = img 157 158 let label1 = cell.viewWithTag(2) as! UILabel 159 label1.text = String(describing: place1nameArrayDay2[indexPath.row]) 160 label1.adjustsFontSizeToFitWidth = true 161 162 let label2 = cell.viewWithTag(3) as! UILabel 163 label2.text = String(describing: place1timeArrayDay2[indexPath.row]) 164 label2.adjustsFontSizeToFitWidth = true 165 }else if place == "2", date == "Day1" { 166 let img = UIImage(named: place2imgArrayDay1[indexPath.row] as! String) 167 168 let imageView = cell.viewWithTag(1) as! UIImageView 169 imageView.image = img 170 171 let label1 = cell.viewWithTag(2) as! UILabel 172 label1.text = String(describing: place2nameArrayDay1[indexPath.row]) 173 label1.adjustsFontSizeToFitWidth = true 174 175 let label2 = cell.viewWithTag(3) as! UILabel 176 label2.text = String(describing: place2timeArrayDay1[indexPath.row]) 177 label2.adjustsFontSizeToFitWidth = true 178 }else if place == "2", date == "Day2" { 179 let img = UIImage(named: place2imgArrayDay2[indexPath.row] as! String) 180 181 let imageView = cell.viewWithTag(1) as! UIImageView 182 imageView.image = img 183 184 let label1 = cell.viewWithTag(2) as! UILabel 185 label1.text = String(describing: place2nameArrayDay2[indexPath.row]) 186 label1.adjustsFontSizeToFitWidth = true 187 188 let label2 = cell.viewWithTag(3) as! UILabel 189 label2.text = String(describing: place2timeArrayDay2[indexPath.row]) 190 label2.adjustsFontSizeToFitWidth = true 191 } 192 else { 193 194 } 195 196 197 return cell 198 } 199 200 201 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 202 return 120.0 203 } 204 205 override func didReceiveMemoryWarning() { 206 super.didReceiveMemoryWarning() 207 // Dispose of any resources that can be recreated. 208 } 209 210 211}

Storyboardの状況

Segmented Control
イメージ説明

Table View
イメージ説明

バージョン

xcode 9, swift 4, iOS 11.3

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

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

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

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

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

guest

回答1

0

ベストアンサー

viewDidLoadの中に

self.timetable.dataSource = self self.timetable.delegate = self

を設定したらどうでしょうか?

【追記】
上記のご質問の回答として追記しておきます。

storyboardからdaysegmentWithSenderを消去、コード上では@IBAction func daysegment(_ sender: UISegmentedControl)とする。

投稿2018/04/07 22:14

編集2018/04/12 05:58
newmt

総合スコア1277

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

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

退会済みユーザー

退会済みユーザー

2018/04/08 07:08

確かに書いていませんでした。ご指摘ありがとうございます。しかし、書いても何も変わらず、タイムテーブルは表示されません。何も間違ってないように見えるのですが何が間違っているのでしょうか....
newmt

2018/04/08 07:26 編集

エラーメッセージ的にはstoryboard上で@IBAction func daysegment(sender: UISegmentedControl)がうまく接続されていないようなメッセージですね。 daysegmentは呼ばれていますでしょうか? また、クリーンしてビルドやDerivedDataの削除などは試してみましたでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/08 17:38

はい、deliveredDataをproductのclean build folderから消去を試しましたが変わりませんでした。 質問を編集し、storyboardの状況を記載しましたが、daysegmentは接続されているように思います。
newmt

2018/04/08 22:43 編集

daysegmentWithSenderは何に繋がっていますでしょうか?これを削除したらどうなりますでしょうか? あと self.timetable.dataSource = self self.timetable.delegate = self はstoryboardで繋がっているので不要ですね。
fuzzball

2018/04/09 07:25 編集

Storyboardからコードにアクションを付けると、 @IBAction func daysegment(_ sender: UISegmentedControl) となるはずです。後からアンダーバーを消したのでしょうか? daysegmentWithSenderは、コードからStoryboardにアクションを付けた時のものです。 修正方法1:daysegmentWithSenderを消して、関数名にアンダーバーを付ける。 修正方法2:daysegmentを消す。 【追記】 コードからStoryboardにアクションを付けた後、Storyboardからコードにアクションを付ける(なぜか付けることが出来てしまう‥)と現在の状況になるようです。
退会済みユーザー

退会済みユーザー

2018/04/09 22:48

newmtさん、fuzzballさん、丁寧なご説明ありがとうございます。storyboardからdaysegmentWithSenderを消去、コード上では@IBAction func daysegment(_ sender: UISegmentedControl)としたところ、segmented controlのエラーは消えました。 tableviewは、やはり表示されません。条件が無い場合は表示され、条件をつけると表示されないので、一度書き方を変えてみようと思います。
newmt

2018/04/10 00:49

placeとdateに初期値は設定されていないので、cellForRowAtの条件分岐でelseの中に入り、何も設定していないので何も表示されないのではないでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/11 09:08

コメントしていただいたのに返信が遅くなってしまい本当に申し訳ありません。 else{ return place1imgArrayDay1.count } また、 else{ let img = UIImage(named: place1imgArrayDay1[indexPath.row] as! String) let imageView = cell.viewWithTag(1) as! UIImageView imageView.image = img let label1 = cell.viewWithTag(2) as! UILabel label1.text = String(describing: place1nameArrayDay1[indexPath.row]) label1.adjustsFontSizeToFitWidth = true let label2 = cell.viewWithTag(3) as! UILabel label2.text = String(describing: place1timeArrayDay1[indexPath.row]) label2.adjustsFontSizeToFitWidth = true } としましたが、表示されませんでした。
退会済みユーザー

退会済みユーザー

2018/04/11 15:04

失礼しました。elseの中に設定したTableViewは表示されますがそこから移動する事ができません
newmt

2018/04/11 22:33

移動ができないというのは表示が変わらないということでしょうか? SegmentedControlを切り替えた際に func tableView(_ timetable: UITableView, cellForRowAt indexPath: IndexPath) は呼ばれていますでしょうか?また、その際のdateの値はどうなっていますでしょうか? もし呼ばれていない場合、 daysegmentのでself.timetable.reloadData()を呼び出し、 再度実行してfunc tableView(_ timetable: UITableView, cellForRowAt indexPath: IndexPath)が 呼ばれるかご確認いただけませんでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/12 04:19

コメントありがとうございます。 daysegment swich sender.selectedSegmentIndex{ }の中と、@objc func done(){}の中に、self.timetable.reloadData()と記載したところ、当たり前ですがdoneボタンを押すまでは、daysegmentも動作しません。 どこに記載すればdaysegmentもはじめから動作させることが出来るでしょうか
newmt

2018/04/12 06:04 編集

「doneボタンを押すまでは、daysegmentも動作しません。」UISegmentedControlを切り替えた時に@IBAction func daysegment(_ sender: UISegmentedControl)は呼ばれていないということでしょうか? それともdaysegmentを押した時にtextFieldの値も反映したいということでしょうか? そういう意味でしたら、daysegmentのアクションの中でplace = textField.text!を設定すれば良いかと思います。(doneが押された場合も逆にUISegmentedControlの値を反映させる)
退会済みユーザー

退会済みユーザー

2018/04/12 08:23

daysegment内にplace = textField.text!として、思い通りに、日付、日時を選択してタイムテーブルを表示させることができました。何度もコメントして頂き色々と教えて頂き本当に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問