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

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

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

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

4回答

441閲覧

Swift Collection View Timer

Anoa

総合スコア10

iOS

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/08/27 02:36

編集2020/09/07 05:49

Main Story boardにCollection Viewを設置し、そこに何個かボタン(cell)を設置しました。そのcellを時間ごとに色を変えたいのですがどうすればよいのですか??
例:6つのcellのうち5つは青1つは黄色で1秒ごとに変える
みたいな感じです。
これはタイマーとくくりつけてやるのですか?(?)

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

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

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

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

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

guest

回答4

0

ベストアンサー

基本的には過去のご質問と同じです。

過去のご質問のコードには、タイマ処理の呼び出し部分も書かれていたのでおそらくそれで問題ないとおもますが、例えば下記のような感じになります。

Swift

1class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 2 var redCellIndex: Int = Int.random(in: 0..<12) 3 4 // 略 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 // 略 9 Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(changeColor), userInfo: nil, repeats: true) 10 } 11 12 @objc func changeColor() { 13 redCellIndex = Int.random(in: 0..<12) 14 collectionView.reloadData() 15 } 16 17 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 18 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) 19 // indexPath.row が redCellIndex と一致した場合は赤に、そうでなければ黒にする 20 cell.backgroundColor = self.redCellIndex == indexPath.row ? .red : .black 21 22 return cell 23 24 } 25 // 略 26}

##追記
ミスが2箇所あります。

色を変更するための関数内で次に色を変えたいセルの番号を作る際、letをつけて宣言してしまっているため、同名でスコープの違う変数となってしまっています。今回の場合letは必要ありません。

Swift

1@objc func changeColor() { 2 // let をつけると、changeColor() 関数内部だけで有効な変数となってしまう。 3 //let redCellIndex: Int = Int.random(in: 0..<12) 4 redCellIndex = Int.random(in: 0..<12) 5 collectionView.reloadData() 6 }

また、上記の関数を呼び出している部分がありません。

おそらく、以前はタイマ割り込みで呼び出していたのだと思いますが、残り秒数をカウントダウンする関数を呼び出すように変更した際、誤って消してしまったのだと思います。

1秒に1回更新するのであれば、たとえばdown()の中から色のついたセルを変更するようにする方法もありますし、タイマのインスタンスを2つ作る方法もあるかと思います。

(2020年9月9日:下記のソースコードは変更されています)

Swift

1 var colorCount = 0 2 3 @objc func down() { 4 // 1 秒に1回呼び出す 5 colorCount += 1 6 if colorCount == 100 { 7 colorCount = 0 8 changeColor() 9 } 10 11 if count >= 0{ 12 count = count - 0.01 13 timerLabel.text = String(format: "%.2f",count) 14 }else{ 15 if timer.isValid{ 16 timer.invalidate() 17 timerLabel.text = "Finish" 18 // point = point+0 19 } 20 } 21 }

投稿2020/08/27 03:29

編集2020/09/09 04:16
TsukubaDepot

総合スコア5086

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

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

Anoa

2020/08/27 03:32

なるほど何度もありがとうございます。  これを参考にさせてもらいます。
Anoa

2020/09/07 01:30

かなり時間が経ってしまいましたが、もう一つ質問です。このコードを参考に取り入れました。なのですがタイマーで時間ごとに赤いcellの位置を変える処理の仕方がわかりません。教えていただけると幸いです。
TsukubaDepot

2020/09/07 02:05

回答のコードにそれらの処理が全て入っています。
Anoa

2020/09/07 02:27

現在ここの回答のところに書いたcodeの一部を投稿しました。 エラーを吐いているわけではないのですが実行ができませんでした。なぜなのでしょうか?
TsukubaDepot

2020/09/07 04:12

コードは回答欄ではなく、「質問欄」に追記していただけますでしょうか。 ちなみに、回答欄に投稿していただいたコードを見る限りは大きな問題はなさそうに感じますが、全体をみてみないと何とも言えない部分があります。 「質問本文」に、コードを省略せず全て載せていただけますでしょうか。
Anoa

2020/09/07 04:31

ただいま省略せずに貼らせていただきました。
TsukubaDepot

2020/09/07 05:24

セルの色を変更するための関数を呼び出していません。 修正案を回答に追記しましたので、確認していただけますでしょうか。
Anoa

2020/09/07 05:28

わかりやすく説明していただきありがとうございます。
Anoa

2020/09/09 02:23

度々申し訳ありません。 教えていただいたコードの3つのうち、一番最後のコードの、 上から4行目の changeColor() の部分が複数回呼び出されてしまっている場合、1回呼び出されたら1秒たつまで changeColor()は呼び出さないという処理はどうやったらできますか??
TsukubaDepot

2020/09/09 04:18

最後に追加したコードでは、1秒に一回呼び出すようにしたつもりでしたが、そのようにはなっていませんでした。 down() が呼び出されるたびに `colorCount`に1を加え、累計が 100 (0.01秒x100 = 1秒なので)になったらchangeColor() を呼び出すように変更しました。
guest

0

Swift

1 override func viewDidLoad() { 2 super.viewDidLoad() 3 4 OnGame = true 5 self.collectionView.delegate = self 6 self.collectionView.dataSource = self 7 8 let layout = UICollectionViewFlowLayout() 9 layout.sectionInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) 10 collectionView.collectionViewLayout = layout 11 12 if !timer.isValid { 13 timer = Timer.scheduledTimer(timeInterval:0.01,target: self,selector: #selector(self.down),userInfo:nil,repeats:true) 14 } 15 16 self.collectionView!.register(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier) 17 } 18 @objc func changeColor() { 19 let redCellIndex: Int = Int.random(in: 0..<12) 20 collectionView.reloadData() 21 } 22 // 中略 23 24 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 25 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 26 27 cell.backgroundColor = self.redCellIndex == indexPath.row ? .red : .black 28 29 return cell 30 31 }

投稿2020/09/07 02:23

編集2020/09/07 02:25
Anoa

総合スコア10

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

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

0

Swift

1func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 2 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 3

投稿2020/09/07 02:22

編集2020/09/07 04:48
Anoa

総合スコア10

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

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

0

swift

1 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

投稿2020/09/07 02:19

編集2020/09/07 04:47
Anoa

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問