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

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

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

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

Q&A

解決済

1回答

4477閲覧

UITableViewの特定のセクションヘッダーのみ更新する方法はありますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/10/02 10:23

編集2018/10/02 10:30

いつもお世話になります。

UITableViewにセクションをインサートしているのですが、インサートされた直下のSectionHeaderに設定しているラベルの文字列のみ更新する方法はないでしょうか?
アニメーションの都合もあり、tableView.reloadData()コールし辛いです。
tableView.reloadSectionsを呼ぶとアニメーションが変になりますし、tableView.reloadRowsではヘッダーは更新されないようです。

一番下のSection:2をSection:3にしたい
イメージ説明

swift

1// generateSection 2 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { 3 4 let headerView = testTableView.dequeueReusableHeaderFooterView(withIdentifier: "Section") as! SectionHeaderView 5 headerView.removeSectionBtn.tag = section 6 headerView.removeSectionBtn.isEnabled = section == 0 ? false: true 7 8 headerView.SectionHeaderViewDelegate = self 9 10 let labelStr = "Section:" + String(section + 1) 11 headerView.setValueToSection(LabelStr: labelStr) 12 13 return headerView 14 } 15

swift

1// セクションヘッダーを追加する処理 2 @IBAction func addSectionHeaderView(_ sender: UILongPressGestureRecognizer) { 3 if(sender.state == UIGestureRecognizer.State.began) { 4 } else if (sender.state == UIGestureRecognizer.State.ended) { 5 6 let point = sender.location(in: testTableView) 7 guard let indexPath = testTableView.indexPathForRow(at: point) else { return } 8 9 if !(indexPath.row == 0) { 10 // 配列操作 11 let targetArray = arrayOfArray[indexPath.section] 12 let firsrOfTargetArray = targetArray.prefix(indexPath.row) 13 let secondOfTargetArray = targetArray.dropFirst(indexPath.row) 14 arrayOfArray.remove(at: indexPath.section) 15 arrayOfArray.insert(firsrOfTargetArray.map{$0}, at: indexPath.section) 16 arrayOfArray.insert(secondOfTargetArray.map{$0}, at: indexPath.section + 1) 17 18 // 削除するインデックスパスの配列を作る 19 let deleteIndexes: [IndexPath] = 20 (indexPath.row ..< targetArray.count).map {[indexPath.section, $0]} 21 22 // tableView操作 23 testTableView.beginUpdates() 24 testTableView.deleteRows(at: deleteIndexes, with: insertFA) 25 testTableView.insertSections(IndexSet(integer: indexPath.section + 1), with: insertLA) 26 testTableView.endUpdates() 27 28 print("indexPathsForVisibleRows.count:",testTableView.indexPathsForVisibleRows?.count) 29 print("visibleCells.count:",testTableView.visibleCells.count) 30 /* 31 guard let visibleIndexes = testTableView.indexPathsForVisibleRows else { return } 32 // 画面上に見えている範囲のセルのみ更新 33 testTableView.reloadRows(at: visibleIndexes, with: .none) 34 */ 35 } 36 } 37 } 38 39 40

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

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

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

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

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

guest

回答1

0

ベストアンサー

headerView(forSection:)でUITableViewHeaderFooterViewを取得できます。
そのセクションが表示されていなかったらnilが返るので、削除したインデックスからnilが返るかセクションの数分ループで取得&更新していけばいいかと。

投稿2018/10/02 13:18

toki_td

総合スコア2850

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

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

退会済みユーザー

退会済みユーザー

2018/10/02 13:41 編集

回答ありがとうございます。 testTableView.numberOfSectionsでsection数を取得して nilが帰ってきていないセクションだけUITableViewHeaderFooterViewを取得して、変更ですね。 なんとかできそうです。 Section挿入後にSection3となるべきSectionHeader分の、tableView(_ : viewForHeaderInSection) -> UIView?、が自動で呼び出されないんですね...。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問