回答:
では、セルの選択を解除didSelectRowAtIndexPath
するために呼び出す必要がありますdeselectRowAtIndexPath
。
だから、あなたがあなたの中で他に何をしているとしても、didSelectRowAtIndexPath
それを呼び出すdeselectRowAtIndexPath
だけです。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Do some stuff when the row is selected
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
-deselectRowAtIndexPath:animated:
そのtableViewプロパティのメソッドをから呼び出します-viewDidAppear
。ただし、UIViewControllerサブクラスにテーブルビューがある場合は-deselectRowAtIndexPath:animated:
、-viewDidAppear
自分で呼び出す必要があります。:)
-viewWillAppear:
それを壊したもののオーバーライドでした。[super viewWillAppear:animated]
再び機能させるための呼び出しを追加します。
UITableViewController
のclearsSelectionOnViewWillAppear
プロパティがYES
(デフォルト)に設定されてい[super viewWillAppear]
て、呼び出されないようにしていない場合、自動選択解除動作が発生します。
それを行う最もクリーンな方法は、viewWillAppearです。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Unselect the selected row if any
NSIndexPath* selection = [self.tableView indexPathForSelectedRow];
if (selection) {
[self.tableView deselectRowAtIndexPath:selection animated:YES];
}
}
これにより、コントローラーに戻ったときに、選択がフェードアウトするアニメーションが表示されます。
http://forums.macrumors.com/showthread.php?t=577677から取得
Swiftバージョン
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// deselect the selected row if any
let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
if let selectedRowNotNill = selectedRow {
tableView.deselectRow(at: selectedRowNotNill, animated: true)
}
}
viewDidAppear
代わりにそれを呼び出します。
Swiftユーザーの場合、これをコードに追加します。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
Obj-Cの代わりにSwiftを除いて、それは非難の答えです。
Swift 4で更新
いくつかの実験の後、これも以前の回答に基づいて、最良の動作は2つの方法で達成できるという結論に達しました(実際にはほとんど同じです)。
// First Solution: delegate of the table View
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
}
// Second Solution: With the life cycle of the view.
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
let selectedRow: IndexPath? = tableView.indexPathForSelectedRow
if let selectedRow = selectedRow {
tableView.deselectRow(at: selectedRow, animated: false)
}
}
私は最初の解決策を個人的に採用しています。tableViewに戻るときに小さなアニメーションが必要な場合の別の可能性は、次のようにすることですviewWillAppear
。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let selectedRow: IndexPath? = _view.tableView.indexPathForSelectedRow
if let selectedRow = selectedRow {
_view.tableView.deselectRow(at: selectedRow, animated: true)
}
}
最後に、UITableViewControllerを使用している場合は、プロパティclearsSelectionOnViewWillAppearを利用することもできます。
Kendall Helmstetter Gelnerが彼のコメントで説明する動作を取得するには、おそらくdeselectRowAtIndexPathではなく、コントローラーのclearsSelectionOnViewWillAppearプロパティが必要です。おそらくこれは誤ってYESに設定されたのでしょうか?
新しいUITableViewControllerサブクラスについては、デフォルトのAppleテンプレートのコメントを参照してください。
- (void)viewDidLoad
{
[super viewDidLoad];
// Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO;
}
ドリルダウンアプリケーションでもこの問題が発生していました。別のViewControllerを押した後、VCと呼ぶビューコントローラーが戻った後、VCで選択されたセルが強調表示されたままになります。私のアプリでは、ドリルダウンの2番目のレベル(3レベルのうち)を処理するVCを作成しました。
私の場合の問題は、VCがUIViewController(TableViewを含むビューを含む)であったことです。代わりに、VCをUITableViewController(TableViewを含む)にしました。UITableViewControllerクラスは、プッシュから戻った後、テーブルセルのハイライト解除を自動的に処理します。「tableViewのdeselectRowAtIndexPathに関する問題」の投稿に対する2番目の回答は、この問題に対するより完全な回答です。
XViewで「ナビゲーションベースのアプリ」としてアプリを作成したとき、ルートビューコントローラーはサブテーブルUITableViewControllerにすでに作成されているため、ルートビューコントローラーでは問題は発生しませんでした。
これらのいずれもうまくいかない場合は、次の回避策を検討してください。
アンワインドセグエを使用して呼び出します。
@IBAction func unwind_ToTableVC (segue: UIStoryboardSegue) {
if let index = tableView.indexPathForSelectedRow {
tableView.deselectRowAtIndexPath(index, animated: true)
}
}
なぜこれを行うのですか?主に、選択解除コードを適切なタイミングで実行できない場合。私はそれがviewWillAppearで機能しないことに問題があったので、巻き戻しがはるかにうまく機能しました。
手順:
巻き戻しセグエ(または上から貼り付け)を最初のVC(テーブルのあるVC)に書き込みます
2番目のVCに移動します。使用している[キャンセル] / [完了] / [その他]ボタンからControlキーを押しながらドラッグして、そのVCを閉じ、上部の[終了]アイコンにドラッグします。
手順1で作成した巻き戻しセグエを選択します
幸運を。
私は長い間同じ問題を抱えてきたので、他の誰かが苦労している場合に備えて:
あなたを見てください -tableView: cellForRowAtIndexPath:
セルを作成しているか、「再利用識別子」を使用しているかを確認します。後者の場合は、IBのテーブルにその識別子のセルがあることを確認してください。再利用識別子を使用していない場合は、行ごとに新しいセルを作成するだけです。
これにより、テーブルに「フェードした選択された行」が表示されることが予想されます。
Swift 3の場合:viewDidDisappearで使用することをお勧めします
定義:-
var selectedIndexPath = IndexPath()
viewDidDisappear:-
override func viewDidDisappear(_ animated: Bool) {
yourTableView.deselectRow(at: selectedIndexPath, animated: true)
}
didSelectRowAtIndexPath:-
func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath) {
selectedIndexPath = indexPath
}
セルをタッチしてもハイライトされたままの場合は、UITabelViewメソッドを呼び出すことができます。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
`[tableView deselectRowAtIndexPath:indexPath animated:YES];`
}
または、次の方法を使用して、要件に応じて変更できます。
//マーク:UITableViewDelegate
func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.backgroundColor = UIColor.greenColor()
}
}
func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
cell.backgroundColor = UIColor.blackColor()
}
}
deselectRowAtIndexPath
行を選択して新しいビューを表示する場合は、viewDidAppearでを呼び出すことをお勧めします。