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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

811閲覧

Xcode swift UITableview

daigakuse-

総合スコア67

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クリップ

投稿2020/09/18 15:11

現在iOSアプリ開発の勉強を行なっています。
UITableViewの動作が所望通りにならないので、アドバイスいただけますと幸いです。

3つセクションをもつTableviewをstoryboardで設定しています。
各セクションは、Cellの上にUIViewを置き、その上にUILabelを置いています。
レイヤーはこんな感じです。
Table View
|
|-- Table View Cell (info)
|
|-- Content View
|
|----UIView
|
|---UILabel

※UIViewを配置している理由は影をつけるためだけです。いい方法が思いつかなかったので。

下記コードで、各セクションのセルに入れる内容を分けています。
各セクションのCellには共通してラベルを表示しています。
3つ目のセクション(Section2)では、ログアウトというラベルを文字配置真ん中で表示しています。
また、UIViewの背景色を変える、CellのaccessoryTypeをnoneにnoneにする処理をいれています。

swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 3 // セルを取得する 4 let Cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Info", for: indexPath) 5 6 let label = Cell.viewWithTag(1) as! UILabel 7 let view = Cell.viewWithTag(2)! 8 9 switch indexPath.section { 10 case 0: 11 12 label.text = String(describing: userinfo_contents[indexPath.row]) 13 14 case 1: 15 16 label.text = String(describing: rule_contents[indexPath.row]) 17 18 case 2: 19 20 label.text = "ログアウト" 21 label.textAlignment = .center 22 23 24 //先頭のCellにも反映してしまうコード 25 view.layer.backgroundColor = UIColor.systemGray5.cgColor 26 Cell.accessoryType = .none 27 28 default: 29 print("default") 30 } 31 32 return Cell 33 }

上記コードを実機で動かすと、表示された時は
最後のCell(Section2)のみ 文字配置真ん中 背景色変更 が適用されうまくいっているのですが
1枚目
2枚目

何回かViewを上下させてうごかすと、先頭のCell(Section0)のプロフィールまで
文字配置真ん中 背景色変更 が適用されてしまいます。
イメージ説明

とくに高速に上下させた場合はすぐ先頭のCellも変更されてしまいます。
これはCollectionViewでも同じような挙動がおきてしまうのですが、cellForRowAt関数内では見た目を変える処理は良くないのでしょうか。
初学者ゆえ皆目見当もつきません。
なにかご教授頂けますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

tableView の Cell は毎回新しい Cell をつくるのではなく、最初にある一定の数を作ったらあとは使い回しするようになっています。

Swift

1 let Cell = UITableViewCell(......)

と毎回新しいインスタンスを作るのではなく、

Swift

1 // セルを取得する 2 let Cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Info", for: indexPath)

という具合に、一度登録した Cell を Dequeue しているのがその理由です。

Cell のインスタンスを作るという作業はそれなりに時間がかかる作業のため、使い回しをしなければ、高速でスワイプしたときなどの処理が間に合わないのです。

そういう背景から、使いまわされた Cell というのは、「以前使われた時の情報」が残ってしまいます。

したがって、表示したい Cell 一つひとつに、毎回書式などを設定してあげる必要があります。

たとえば、つぎのようにするとお望みの結果になるのではないでしょうか。

Swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 3 // セルを取得する 4 let Cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Info", for: indexPath) 5 6 let label = Cell.viewWithTag(1) as! UILabel 7 let view = Cell.viewWithTag(2)! 8 9 // 一度、全てのセルの書式を基本に戻す 10 view.layer.backgroundColor = .white 11 label.textAlignment = .left 12 Cell.accessoryType = .disclosureIndicator 13 14 switch indexPath.section { 15 case 0: 16 17 label.text = String(describing: userinfo_contents[indexPath.row]) 18 19 case 1: 20 21 label.text = String(describing: rule_contents[indexPath.row]) 22 23 case 2: 24 25 label.text = "ログアウト" 26 27 // 必要なセルだけ書式を再設定する 28 label.textAlignment = .center 29 view.layer.backgroundColor = UIColor.systemGray5.cgColor 30 Cell.accessoryType = .none 31 32 default: 33 print("default") 34 } 35 36 return Cell 37 } 38

投稿2020/09/18 18:41

TsukubaDepot

総合スコア5086

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

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

daigakuse-

2020/09/19 07:59

Cellを再利用していること、大変勉強になりました。自分でも理解して使わなくてはと思い調べ直したところprepareForReuse関数に行き着いたのですが、公式ドキュメントによるとパフォーマンス上からTsukabaDepotさんからご教授いただいたコードが最適と記述されていたため、参考にさせていただきます!本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問