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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

Q&A

1回答

2821閲覧

UITableVIewにて途中までスクロールした状態で、ボタンタップによりreloadData()した後、上にスクロールすると途中でスクロールの最下部に戻ってしまう。

kkkouki

総合スコア10

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

0グッド

0クリップ

投稿2019/01/04 07:49

編集2022/01/12 10:55

前提・実現したいこと

UITableVIewにて途中までスクロールした状態で、テーブルの更新を行いたいです。
さらに、その後のスクロールも問題なく行いたいです。
今の状況では、テーブル更新後、上にスクロールすると、途中でUITableVIewの最下部に戻るのですが、最下部に戻らないで、スクロール上部のセルの再描画が行われるまで、
そのまま待機し、スクロール方向のみのセルを表示するようにさせたいです。

発生している問題・エラーメッセージ

UITableVIewにて途中までスクロールした状態で、テーブルを更新した後、
上にスクロールすると、途中でUITableVIewの最下部に戻ってしまいます。

エラーメッセージは特にありません。

言語名

swift4

試したこと

以下の通りbeginUpdates()/endUpdates()を試したが同様にその後のスクロールが上手く行きませんでした。
tableView.beginUpdates()
//テーブルビュー更新処理
tableView.endUpdates()

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

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

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

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

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

hameji001

2019/01/04 14:46 編集

コードがないので、お答えできません。 もう少し全体がないとなんとも言えません。(x3回目) あのー、何度微妙な修正をしても、せめて、 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {} func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} の2つの中身をそのまま全部載せてくれないと、アドバイスはできませんが、、、 例えるなら、電卓で計算するにあたり、式を打ち込んで、 最後に「=」を押して結果がでる状況で、 式の内容を相手に伝えずに、 「=」を押したら、正しい答えが出ないんです どこがおかしいですか?って聞いてるようなものです。 もう少し、質問する時考えてください。
kkkouki

2019/01/04 14:46 編集

コメントありがとうございます! 該当コードは以下です。 tableView内のtextViewの変更ごとにtableView.beginUpdates()が呼ばれ、テーブルの高さが更新されるようにしているのですが、 例えば、テーブルを下にスクロールした状態でテキストを変更した後、上に一気にスクロールすると、 セルの再描画が間に合わないためか、一番下のcellに移動してしまいます。 ``` func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell") as! TableViewCell cell.callBack = { textView in //tableView内のテキスト変更時、テキストの高さにcellの高さを合わせる。 tableView.beginUpdates() var scOffset = tableView.contentOffset let beforeFrameHeight = textView.frame.size.height textView.sizeToFit() let yDiff = textView.frame.size.height - beforeFrameHeight scOffset.y += yDiff tableView.contentOffset = scOffset tableView.endUpdates() } } //テキスト変更をcellに反映させる処理   ~~~ //cellをreturn return cell } ```
hameji001

2019/01/04 15:20 編集

んー、あまりbeginUpdates(), endUpdates()を使ったことがないですが、 以下のサイトをみると、beginUpdates(), endUpdates()は 動的にその場で大きさを変更する時に用いるように見受けます。 つまり、ユーザーがした動作に反応して、その場で大きさが変わる didSelectRowAt indexPathの中で使うようなコードの気がしますよ。 参考サイト https://qiita.com/KikurageChan/items/71d4e1e84d039d1e2f5a 表示内容によって、cellの高さをそれぞれできちんとしたいというのであれば、 以下のteratailが参考になると思います。 https://teratail.com/questions/14177 cellの内容を描出するcellForRowAt indexPathでは、 その場で動的に変更するコードを書いても、 結局は最後にできた結果しか表示されないと思うので、 変なコードは挟まない方がいいと思います。 今の変な挙動はそのコードが原因だと思われるので、修正が必要と見受けます。 そもそもまず、大元の質問内容が、何をしたいのかはっきりしません。。。 例えば、 ①1−10までのデータを表示して、スクロールして、 10を超えそうになったら、次の11−20を読み込みたいのか、 ②1−10を全く違う種類のデータに入れ替えたいのか、 どーしたいのかもう少しはっきりすると、具体的な答えをお伝えできると思います。 ちなみに、ボタンタップというのはcellをタップなのか NavigationBarにあるButtonをタップなのか、cellにUIButtonを設置しているのか、 どの状況なのかぼやーっとしてて、特定できません。 質問責めにしてしまい申し訳ないですが、可能なら、 コード+Storyboardのキャプチャ画像も添付であると分かりやすいです。
kkkouki

2019/01/04 15:33

ご指摘ありがとうございます。 質問の仕方が悪かったようです。すみません。 私が実現したいのは、メモ機能です。 なので、(ユーザによる)tableView内のtextViewの変更ごとに、テーブルの高さを動的に更新したいのです。 なお、現状、didSelectRowAtには何も実装してませんが、そこに処理を書くのでは更新が遅すぎてしまいます。。 class ViewController: UIViewController, UITableViewDelegate,UITableViewDataSource , UITextFieldDelegate{ @IBOutlet weak var tableView: UITableView! var edittedList = [String]() func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell") as! TableViewCell cell.callBack = { textView in //tableView内のテキスト変更時、テキストの高さにcellの高さを合わせる。 tableView.beginUpdates() var scOffset = tableView.contentOffset let beforeFrameHeight = textView.frame.size.height textView.sizeToFit() let yDiff = textView.frame.size.height - beforeFrameHeight scOffset.y += yDiff tableView.contentOffset = scOffset tableView.endUpdates() } } cell.setCell(changeText: self.edittedList[indexPath.row]) return cell } //現段階では中身に何も実装してません。 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { } } class TableViewCell: UITableViewCell, UITextViewDelegate { var callBack: ((UITextView) -> ())? @IBOutlet weak var contentText: UITextView! override func awakeFromNib() { super.awakeFromNib() contentText.delegate = self contentText.isScrollEnabled = false } //テキストに文字が入力されたり削除されたりすると、このメソッドが呼ばれる。 func textViewDidChange(_ textView: UITextView) { callBack?(textView) } //変更した内容をcellに反映。 func setCell(changeText: String) { contentText.text = changeText } }
hameji001

2019/01/04 15:45 編集

textViewなんですか???textFieldではなく??? もし、inputでその場で表示を変えたいというのであれば、 textViewDelegateもしくはtextFieldDelegateのfuncの中で行うべき処理だと思います。 そもそも、Appleのガイドラインをよく読んでませんが、 普通はおそらくTableViewは表示するだけもしくは 簡単な変更を受け付ける画面と思われるので、 アプリの申請に通らないかもしれません。 (画面を2つにわり、半分にtableview, 半分にtextViewなら分かりますが、、、) たくさん行があり、それぞれに何行もそこで表示をして、 変更できるのは見づらくないですか? 普通なら、cellをselectして、編集のviewに飛ぶのが手間は増えますが、 使いやすい正しい形のような気がします。。。 appleの純正でもある、メモのようなアプリ。 とはいえ、実装したいというのであれば、customcellにして、 delegateをそのcustomcellのclassから飛ばさないとできないと思います。
guest

回答1

0

質問内容がはっきりしたので、こっちに書きます。
①使うべきは、TextViewDelegateのtextViewdidchangeのメソッドだと思われます。
(textViewの内容が変わった際に実行されるプログラムを書く場所)
参考URL https://kawairi.jp/weblog/vita/201311189607

②あとは、customcellのdelegateを設定して、それをtableviewに繋いで、
以下、textFieldですが、参考になります。
http://an.hatenablog.jp/entry/2015/10/04/015712

③先ほどのbeginUpdates()/endUpdates()をうまく使えばいいはずです。
(もしかしたら、textViewのconstraintsをきちんと設定していたら、
beginUpdate/endUpdateいらないかもしれないですが、、、)

ちなみに、先ほどのコードでTableViewCellにキャストしていましたが、
TableViewCellはアップルが作った通常の型なので、不要です。
個別にcustomcellを用意し、もちろん違う名前をつけ、
storyboardで設定しないといけないことになります。

投稿2019/01/04 15:50

編集2019/01/04 15:53
hameji001

総合スコア639

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

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

kkkouki

2019/01/05 04:45

リンクまでありがとうざいます! ご指摘の手順でやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問