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

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

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

解決済

2回答

819閲覧

UITableViewCellが一度消えて再度出てきたときに制約が消えている

jiei2717

総合スコア19

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/12/18 11:37

swiftでUITableViewの中にコードからUI部品を設置してNSなんとかAnchorで制約をつけています。
Viewをロードした直後は上手く表示されているのですがスクロールによって一度画面上から消えた後にもう一度スクロールして画面に現れたときに、本来の制約の場所だけでなく、全てのUI部品が一つずつCellの左上のところに表示されてしまいます。どのようにしたらこれを防げますか。
本来予想している、Viewをロードした直後の画面
スクロールしてCellが画面から見えなくなった後なぜかこうなってしまう

swift

1func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 2 guard let cell = tableView.dequeueReusableCell(withIdentifier: "allotCell", for: indexPath) as? AllotTableViewCell else { 3 return UITableViewCell() 4 5 } 6 let instance = greatInstance[indexPath.row] 7 let comission = UILabel() 8 comission.textColor = UIColor.black 9 comission.backgroundColor = UIColor.white 10 comission.text = instance.name 11 comission.translatesAutoresizingMaskIntoConstraints = false 12 cell.addSubview(comission) 13 14 comission.topAnchor.constraint(equalTo: cell.topAnchor, constant: 10).isActive = true 15 16 comission.heightAnchor.constraint(equalToConstant: 30).isActive = true 17 18 comission.trailingAnchor.constraint(equalTo: cell.trailingAnchor, constant: 10).isActive = true 19 comission.leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 10).isActive = true 20 21 for i in PrimeCommission.sharedInstance.schoolFestival.allots { 22 23 let label = UILabel() 24 25 26 label.textColor = UIColor.black 27 label.backgroundColor = UIColor.white 28 label.text = i.name 29 label.translatesAutoresizingMaskIntoConstraints = false 30 // Initialization code 31 32 cell.addSubview(label) 33 cell.labels.append(label) 34 35 let image = SpecialButton() 36 print ("a") 37 image.translatesAutoresizingMaskIntoConstraints = false 38 image.superTag["Commission"] = greatInstance.firstIndex(of: instance)! 39 image.superTag["Allot"] = PrimeCommission.sharedInstance.schoolFestival.allots.firstIndex(of: i) 40 41 image.addTarget(self, action: #selector(buttonEvent(_:)), for: UIControl.Event.touchUpInside) 42 if instance.allot.contains(i){ 43 image.setImage(UIImage(named: "無題118"), for: .normal) 44 45 }else{ 46 image.setImage(UIImage(named: "無題119"), for: .normal) 47 48 } 49 50 cell.addSubview(image) 51 cell.images.append(image) 52 print("c") 53 54 } 55 56 57 58 for i in 0...PrimeCommission.sharedInstance.schoolFestival.allots.count - 1 { 59 60 var ta :NSLayoutYAxisAnchor 61 62 if i == 0 { 63 ta = comission.bottomAnchor 64 65 print (i) 66 } else { 67 ta = cell.labels[i-1].bottomAnchor 68 print(i) 69 } 70 ///* 71 cell.images[i].centerYAnchor.constraint(equalTo: cell.labels[i].centerYAnchor).isActive = true 72 cell.images[i].trailingAnchor.constraint(equalTo: cell.trailingAnchor, constant: -10).isActive = true 73 cell.images[i].heightAnchor.constraint(equalToConstant: 35).isActive = true 74 cell.images[i].widthAnchor.constraint(equalToConstant: 35).isActive = true 75 cell.labels[i].topAnchor.constraint(equalTo: ta, constant: 10).isActive = true 76 cell.labels[i].heightAnchor.constraint(equalToConstant: 30).isActive = true 77 78 79 cell.labels[i].leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 10).isActive = true 80 81 82 83 cell.labels[i].trailingAnchor.constraint(equalTo: cell.images[i].leadingAnchor, constant: 10).isActive = true 84 85 if i == PrimeCommission.sharedInstance.schoolFestival.allots.count-1 { 86 cell.labels[i].bottomAnchor.constraint(equalTo: cell.bottomAnchor, constant: -10).isActive = true 87 88 } 89 //*/ 90 91 92 93 } 94 95 return cell 96 }

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

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

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

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

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

jiei2717

2018/12/18 11:56

どうやらadd subviewが蓄積されるらしいという所まではわかったのですが、どうしたら良いかわかりません
guest

回答2

0

ベストアンサー

AllotTableViewCellが再利用された場合には余計な処理をしないようにしてみたらいかがでしょうか。

AllotTableViewCellのイニシャライザで一度だけ行うか、
AllotTableViewCellのメンバにフラグを持っておいて一度だけ行うように制御するか。

もしくは自分で使うだけのツールのような場合はそもそもAllotTableViewCellを再利用しない(毎回インスタンスを作る)というのもアリです。

投稿2018/12/19 01:06

takabosoft

総合スコア8356

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

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

jiei2717

2018/12/20 14:16

出来ました!ありがとうございます!
guest

0

本題の前に、セルにviewを乗せるときは直接乗せるのではなくcontentViewに乗せます。

swift

1cell.contentView.addSubview(comission)

で、

どうやらadd subviewが蓄積されるらしいという所まではわかったのですが、どうしたら良いかわかりません

手っ取り早くやるなら、subviewを全て剥がせばいいです。

swift

1cell.contentView.subviews.forEach {$0.removeFromSuperview()}

再利用の恩恵は無くなりますが。(と言っても今のコードと同じ状況です)
パフォーマンスが気になるようならtakabosoftさんの回答が参考になると思います。

投稿2018/12/19 01:34

fuzzball

総合スコア16731

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

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

jiei2717

2018/12/20 14:16

こちらでも出来ました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問