0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UITableViewをコードから選択した場合、セルの解除のメソッドが呼ばれない場合の対処方法

Last updated at Posted at 2019-10-30

はじめに

UITableViewの初期値としてセルにチェックマークを入れるため、コードからセルを選択する必要がありました しかし、次のセルに選択が移った時、初期値に入れておいたチェックマークが外れなかったのです。 ![例1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259778/691308b5-471d-0abd-5678-794d3b62ec29.gif)

コードからセルを選択するとセルの解除が呼ばれない

コードからセルを選択をすると、解除のメソッドが呼ばれないようですね deselectRow(at:animated:)selectRow(at:animated:scrollPosition:) ※ Apple Reference
Calling this method does not cause the delegate to receive a tableView(_:willDeselectRowAt:) or tableView(_:didDeselectRowAt:) message, nor does it send selectionDidChangeNotification notifications to observers.

対処方法

UITableViewのデリゲートメソッド、[tableView(_:willSelectRowAt:)](https://developer.apple.com/documentation/uikit/uitableviewdelegate/1614943-tableview)に注目して解決しました
UITableViewController.swift
// セルを選択するその直前に呼ばれるメソッド
    override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath? {
        //まだ、この時は次のセルに選択が移っていない、選択中のセルのインデックスパスを取得する。
        if let selectedRow = tableView.indexPathForSelectedRow { 
            tableView.cellForRow(at: selectedRow)?.accessoryType = .none
        }
        //このindexPathが次に選択されたセルのインデックスパスになる
        return indexPath
    }

// セルを選択した時に呼ばれるメソッド
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }

willSelectRowAtの中では、まだ次のセルにインデックスパスが移っていないため、
tableView.indexPathForSelectedRowにて取得ができる。
ということで、コードで選択した場合であっても選択していたセルのインデックスパスが取得できました。
例2.gif

参考にさせていただいた記事

[UITableViewをプログラムから選択する実装について(チェックマークが表示・非表示されない問題)](https://qiita.com/KikurageChan/items/f2bebb027f2353a6cd22) [UITableView Apple Reference](https://developer.apple.com/documentation/uikit/uitableview)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?