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

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

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

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

1回答

3400閲覧

TavleVIewCellのスクロールを、Cellの選択前と同じ位置にしたい

退会済みユーザー

退会済みユーザー

総合スコア0

TableView

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

スクロール

スクロールとは、ディスプレイスクリーン上において連続的にコンテンツが滑っていくことを指します。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2017/12/26 06:50

編集2022/01/12 10:55

xcode9でTableViewCellを用いた一覧を作っています。

tableViewでセルを選択してSubTableViewControllerを開き、戻るボタンでまたtableViewに戻った時に、スクロールがセルを選択する前の位置になるようにしたいです。(今はtableViewに戻る度に、スクロールが一番上まで戻ります。)

// Cell が選択された場合 func tableView(_ table: UITableView,didSelectRowAt indexPath: IndexPath) { //スクロールを保存 wlastOffsetY = CGFloat(UserDefaults.standard.integer(forKey: "wacg")) wlastOffsetY = tableView.contentOffset.y UserDefaults.standard.set(wlastOffsetY, forKey: "wacg") } //スクロールを読み込む wlastOffsetY = CGFloat(UserDefaults.standard.integer(forKey: "wacg")) tableView.setContentOffset(CGPoint(x: 0, y:wlastOffsetY), animated: true)

これでスクロール量は保存できたのですが、読み込むコードをどこに書き込めばうまく実装されるのか、色々試したのですがわかりません。

試したこと

1. SubTableViewの戻るボタンを押した時に読み込む @IBAction func bb (_ sender: Any){ wlastOffsetY = CGFloat(UserDefaults.standard.integer(forKey: "wacg")) tableView.setContentOffset(CGPoint(x: 0, y:wlastOffsetY), animated: true) } 2. override func viewDidLoadに入れる override func viewDidLoad() { wlastOffsetY = CGFloat(UserDefaults.standard.integer(forKey: "wacg")) tableView.setContentOffset(CGPoint(x: 0, y:wlastOffsetY), animated: true) } 3. func scrollで指定する func scroll(to direction: UITableView, animated: Bool){ wlastOffsetY = CGFloat(UserDefaults.standard.integer(forKey: "wacg")) tableView.setContentOffset(CGPoint(x: 0, y:wlastOffsetY), animated: true) }

1、2ではsetContentOffsetの行に
Fatal error: Unexpectedly found nil while unwrapping an Optional valueが出てRunできません。
3ではAppDelegate.swiftにsignal SIGABRTと出てRunが止まってしまいます。

ご教授のほど宜しくお願い致します。

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

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

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

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

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

fuzzball

2017/12/26 06:51

「色々試したのですが」は、具体的にどこに書いて試したのか教えて下さい。
fuzzball

2017/12/26 07:11

SubTableViewというのはViewControllerですか?それともただのViewですか?
退会済みユーザー

退会済みユーザー

2017/12/26 07:19

情報が足りず申し訳ありません。試した内容を追加しました。また、書き間違えていました、SubTableViewControllerです。
guest

回答1

0

元ViewControllerのviewWillAppearviewDidAppearで設定して下さい。

  • スクロールを見せたくないならviewWillAppearでアニメーションなし
  • スクロールを見せたいならviewDidAppearでアニメーションあり

という感じかなと思います。

初回表示時など、SubTableViewControllerから戻ってきた時以外にも呼ばれますので、その辺を考慮しておかないといけません。(オフセット値の初期化など)

また、オフセット値の保存にUserDefaultsを使う必要はなく、インスタンス変数でかまいません。

投稿2017/12/26 07:28

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2017/12/26 08:01

ご回答いただきありがとうございます。 override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView.setContentOffset(CGPoint(x: 0, y:wlastOffsetY), animated: false) } このように書き込んだところ、セルの選択時に Fatal error: Unexpectedly found nil while unwrapping an Optional value とエラーが出てしまいました。 知識が至らずお恥ずかしいのですが、どのように使うか、また、オフセット値の初期化方法を教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問