2016-11-26 4 views
0

今、セルを左にスライドさせて「好きな」ボタンを表示してクリックすると、スワイプしたセルではなく、「好きな」ラベルがランダムなセルに表示されます。指定したボタンをタップすると、右のセルで「お気に入り」ラベルを表示/非表示にするにはどうすればよいですか?特定のセルにラベルを割り当てる方法は?

今editActionsForRowAt関数の私のコードは次のとおりです。

internal func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell 

    let favorite = UITableViewRowAction(style: .normal, title: "Favorite") { action, index in 
     cell.favoriteLabel.text = "Favorite" 
     tableView.reloadRows(at: [indexPath], with: .none) 
    } 
    favorite.backgroundColor = UIColor.orange 

    return [favorite] 
} 

問題は「favoriteLabel」=「お気に入り」は「お気に入り」

+2

** 'cellForRowAtIndexPath'の外に再利用可能なセルを作成することは絶対にありません。モデル(データソース配列)を更新し、行またはテーブルビュー全体を再ロードします。 – vadian

+0

@vadianどうすれば正しいセルを更新しているのですか(これは私の問題です)また、私のセルが別の関数で作成されていれば、私はどのように私の "favoriteLabel"にアクセスできますか? –

+0

'dequeueReusableCell(withIdentifier:for:)'の代わりに 'cellForRow(at:)'メソッドを使用してください。 – rmaddy

答えて

1
に右のセルの「favoriteLabel」を設定していません設定されて

ここでは間違ったアプローチをとっています。セルを直接更新するのではなく、データモデルを更新してから、インデックスパスでセルを再ロードする必要があります。次に、cellForRowAtは、更新されたデータモデルに基づいて更新されたセルを適切に表示します。

実際には、2つの奇妙な組み合わせがあります。あなたは(間違って)セルを取得し、そのラベルを設定して、その行を再ロードしようとします。両方をしないでください。データモデルを更新し、行をリロードするだけです。それでおしまい。

dequeueReusableCellcellForRowAt:の外部に決して呼び出さないでください。現在のアプローチ(スクロールした後にはうまく動作しない可能性があります)を主張する場合は、dequeueReusableCellへの呼び出しをcellForRow(at:)への呼び出しに置き換える必要があります。

+0

ありがとう!それは少しコメントをクリアした。最初のアプローチを試みるでしょう –

+0

私の "データモデル"はどういう意味ですか? –

+0

テーブルを作成するためにテーブルビューのデータソースが使用するデータ。 'cellForRowAt'と' numberOfRowsInSection'であなたが使っている配列(または何でも)。 – rmaddy

関連する問題