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

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

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

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

Swift

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

Q&A

1回答

544閲覧

(Swift)UITableViewのcellForRowAtメソッド内で使用したい変数の値がうまく表示されない

boderline3

総合スコア18

Xcode

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

Swift

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

0グッド

0クリップ

投稿2017/06/22 11:27

編集2017/06/23 03:19

階層

上記画像の階層のように、collectionViewの上にtableViewを配置しております。

collectionViewはViewController.swiftにデリゲートを設定しており、
tableViewはCalendarCell.swiftにデリゲートを設定しています。
双方のファイルで同じ変数を共有したいため、AppDelegate.swiftに変数day:Intを定義しています。
collectionViewのscrollViewDidEndDragging内で、
collectionViewがページングされるたびに変数dayの値を変更し、
その値をtableViewのcellForRowAt内で使用したいと思うのですが、

scrollViewDidEndDraggingでの変数dayの値と、
cellForRowAtでの変数dayの値が一致しません。
scrollViewDidEndDragging内では、右へ1ページ進む毎に変数dayの値が1加算され、左に1ページ戻る事に変数dayの値が1減算されます。
cellForRowAtでの変数dayの値もscrollViewDidEndDraggingに合わせたいと思います。

双方のメソッドが呼び出されるタイミングが関係しているのでしょうか。

解決策をご教示頂けますと幸いです。
下記に双方のメソッド内のコードを記述致します。

// ViewController.swift func showDate() { let delegate = UIApplication.shared.delegate as! AppDelegate let seconds = TimeInterval(dayCount*24*60*60) now = NSDate(timeIntervalSinceNow: seconds) as Date let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "en_US") dateFormatter.dateFormat = "d MMM yyyy" let date1 = dateFormatter.string(from: now as Date) dayTitleLabel.text = date1 let year = calendar.component(.year, from: now as Date) let month = calendar.component(.month, from: now as Date) delegate.day = calendar.component(.day, from: now as Date) let comp = Calendar.Component.weekday let weekday = NSCalendar.current.component(comp, from: now as Date) holidayFlag = holidayObject.judgeJapaneseHoliday(year: year, month: month, day: delegate.day) if holidayFlag == true || weekday == 1 { dayTitleLabel.textColor = UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 255.0/255.0, alpha: 0.3) } else if weekday == 7 { dayTitleLabel.textColor = UIColor(red: 255.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.3) } else { dayTitleLabel.textColor = UIColor.black } }
// ViewController.swift func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { scrollBeginingPoint = collectionView.contentOffset; }
// ViewController.swift func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { var currentPoint = collectionView.contentOffset; if(scrollBeginingPoint.x < currentPoint.x){ dayCount += 1 showDate() }else{ dayCount -= 1 showDate() } }
// CalendarCell.swift func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") let delegate = UIApplication.shared.delegate as! AppDelegate let dateLabel = cell?.viewWithTag(2) as! UILabel let format = DateFormatter() format.dateFormat = "H:mm" delegate.sortedContents = delegate.contents.sorted(by: { $1.startDate>$0.startDate}) let strDate = format.string(from: delegate.sortedContents[indexPath.row].startDate) + ">>>" + format.string(from: delegate.sortedContents[indexPath.row].endDate) dateLabel.text = strDate let label = cell?.viewWithTag(1) as! UILabel label.text = delegate.sortedContents[indexPath.row].title print("day: \(delegate.day)") return cell! }
// ViewController.swift func numberOfSections(in collectionView: UICollectionView) -> Int { return 1 } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return dateManager.daysAcquisition() } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CalendarCell", for: indexPath) as! CalendarCell cell.tableView.reloadData() return cell }

numberOfItemsInSection内で返り値に設定しているdateManager.daysAcquisition()は、DateManager.swiftというファイルに定義している「月ごとのセルの数を出すメソッド」です。

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

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

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

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

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

fuzzball

2017/06/22 23:49

scrollViewDidEndDragging内のdayCountって何なんでしょうか?
boderline3

2017/06/23 00:20 編集

失礼致しました。 ViewController.swiftにて var dayCount = 0 と定義しております。1ページスクロールする毎にdayCountを1ずつ加算、減算し、now変数に対して日付を1日加算、減算するようにしています。
fuzzball

2017/06/23 00:30

「右へ1ページ進む毎に変数dayの値が1加算され‥」のdayはdayCountのことですか?
boderline3

2017/06/23 00:43

1ページ進む毎に変数dayCountの値が加算され、その後にshowDate()メソッドが実行されます。そのshowDate()内で、加算された変数dayCountを用いて、変数nowに一日分の秒数を加算します。そして変数nowから日付のみを取り出したものが変数dayになります。この変数の値をtableViewのcellForRowAt内で使用したいのです。説明がかなり雑になっておりました。申し訳御座いません。
boderline3

2017/06/23 00:48

showDate()内やscrollViewDidEndDragging内でprint("day: \(delegate.day)")を記述すると、1ページ移り変わる事に変数dayの値が1ずつ加算、または減算され、デバックエリアに表示されるのですが、cellForRowAt内にprint("day: \(delegate.day)")を記述すると、値がずれるのです。
guest

回答1

0

双方のメソッドが呼び出されるタイミングが関係しているのでしょうか。

おそらくそうだと思います。

スクロール後に表示されるセルは、スクロール完了前(というかスクロール開始前)に生成されますので、cellForRowAt内で参照したdayは加算/減算前の値になっているのではないでしょうか?

‥ということでいいのかな。

【追記】

ViewControllerの遷移の感覚で回答していましたが、よくよく考えてみると、cellForRowAt内でindexPathからdayを求められるのではないでしょうか?

投稿2017/06/23 00:56

編集2017/06/23 02:17
fuzzball

総合スコア16731

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

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

boderline3

2017/06/23 01:58 編集

ご回答有難う御座います。確かに、デバックエリアの表示を見ているとcellForRowAt内で参照したdayは加算/減算前の値のようでした。 cellForRowAt内のdayを別の変数に置き換えて、scrollViewDidEndDragging内のdayが加算/減算した後の値と合わせたいのですが、どのような条件文を書けば可能でしょうか? ご教示頂ければ幸いです。
fuzzball

2017/06/23 02:08

スクロール開始時に±1するのではダメなのでしょうか?(それでいけるかどうかは分かりませんが)
fuzzball

2017/06/23 02:18

回答に追記しましたので、そちらも見て下さい。
boderline3

2017/06/23 02:30

追記有難う御座います。大変恐縮なのですが、cellForRowAt内でindexPathからdayを求める方法がわかりません。サンプルコードをご教示頂けますと幸いです。
fuzzball

2017/06/23 02:44 編集

CollectionViewの設定(セルの構成)がどうなっているか分からないので私には分かりません。
boderline3

2017/06/23 02:50

CollectionView の設定というのはAttributes Inspecterのことでしょうか? それともデリゲートメソッドの内部のことでしょうか? 質問に追記・修正致しますので、ご教示いただけますと幸いです。
fuzzball

2017/06/23 03:03

>>デリゲートメソッドの内部 こっちです
boderline3

2017/06/23 03:20

追記致しました。足りない部分がありましたら、都度ご教示頂けますと幸いです。 何卒 宜しくお願い致します。
boderline3

2017/06/23 03:37 編集

一応、scrollViewDidScrollメソッド内で、 if scrollBeginingPoint != nil || currentPoint != nil { if(scrollBeginingPoint.x == currentPoint.x){ currentPoint = collectionView.contentOffset; if(scrollBeginingPoint.x < currentPoint.x){ dayCount += 1 showDate() let delegate = UIApplication.shared.delegate as! AppDelegate print("scrollViewDidScroll: \(delegate.day)") }else{ dayCount -= 1 showDate() let delegate = UIApplication.shared.delegate as! AppDelegate print("scrollViewDidScroll: \(delegate.day)") } } } このように記述することで解決致しました。 お時間がありましたら。fuzzball様のおっしゃられている解決方法もご教示頂けますと幸いです。
fuzzball

2017/06/23 03:50

dayCount == indexPath.row という認識でいいでしょうか? そうであれば、dayCountの代わりにindexPath.rowを使って同じような計算をすればいいです。
boderline3

2017/06/23 05:22

dayCount == indexPath.rowではありません。
fuzzball

2017/06/23 05:28

1ページ1セルかと思ったのですが違ってましたか‥。 まぁ、解決したようなので良いですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問