2016-10-14 5 views
0

私のセルのボタンについて問題があります。 私のテーブルでは、各行は画像、いくつかのラベル、ボタンで構成されています。 ボタンにチェックマークが付いています。クリックすると、ボタンの画像が変わります。 問題は、別のボタンのイメージが理由もなく変更されることです。 このエラーは、セルが再利用されたために発生します。セルの再利用がうまくいかない - TableView

私は、TableViewCellでprepareForReuseメソッドを使用しようとしましたが、何も起こりません。私もselectedRowAtで試しましたが、結果はありませんでした。私を助けてください。

画像1:

Image 1

画像2:

Image 2

これは私のcustom Cell:

override func prepareForReuse() { 
    if checkStr == "uncheck"{ 
     self.checkBook.setImage(uncheck, for: .normal) 
    } else if checkStr == "check"{ 
     self.checkBook.setImage(check, for: .normal) 
    } 
} 

func isPressed(){ 
    let uncheck = UIImage(named:"uncheck") 
    let check = UIImage(named: "check") 
    if self.checkBook.currentImage == uncheck{ 
     checkStr == "check" 
    } else self.checkBook.currentImage == check{ 
     checkStr == "uncheck" 
    } 
} 
で私のFUNCです私 tableView

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let selectedCell: ListPropertyUserCell = tableView.cellForRow(at: indexPath) as! ListPropertyUserCell 
    let uncheck = UIImage(named:"uncheck") 
    let check = UIImage(named: "check") 
    if selectedCell.checkBook.imageView?.image == uncheck{ 
     selectedCell.checkStr = "check" 
    } else if selectedCell.checkBook.imageView?.image == check{ 
     selectedCell.checkStr = "uncheck" 
    } 
} 
+0

セル自体ではなく、テーブルビューコントローラでセル選択状態を追跡する必要があります。あなたはここで答えの一つを使うことができます - http://stackoverflow.com/questions/28659845/swift-how-to-get-the-indexpath-row-when-a-button-in-a-cell-is-tapped/38941510#38941510鉱山またはJacob Kingさんがタップイベントをテーブルビューコントローラに戻す – Paulw11

+0

@Carloは自分の問題を解決しようとしています。 –

答えて

1

あなたのポスト内の情報から、これはセルの再利用の問題のように見えます。問題は、tableViewがパフォーマンスを維持するために新しいセルを作成するのではなく、セルを再利用することです。セルの状態をリセットしていない場合、再使用されたセルは古い状態で構成されたままになります。

UITableViewCellprepareForReuseメソッドを実装すると、簡単に修正できます。

ただし、tableViewをスクロールした後にチェックボックスを選択する場合は、ビューコントローラでどのセルを 'チェック'するかを保存する必要があります。これを自分で保存するか、tableViewのdidSelectRowAtIndexPathメソッドを使用します。

var checkBook = UIImageView() 

if self.checkBook.image == UIImage(named: "check"){ 
    self.checkBook.image = UIImage(named: "uncheck") 
} 
else{ 
    self.checkBook.image = UIImage(named: "check") 
} 
+0

私はこの問題は細胞の再利用に関するものだと思っていますが、これを使用する方法はわかりません。例を使って答えを編集できますか?私はインターネットで検索しますが、よく分かりません – Carlo

0

はこのようにそれを行うようにしてください。ビューの状態をセルに保存することはできません。あなたは、セットアップのセルは、データソース

func tableView(UITableView, cellForRowAt: IndexPath) 

方法でそれを達成するための最も簡単な方法は、次にあなたが追加/削除することができますUITableViewDelegate

func tableView(UITableView, didSelectRowAt: IndexPath) 
func tableView(UITableView, didDeselectRowAt: IndexPath) 

メソッドを実装することであるべきこれらのメソッドとcellForRowAtIndexPath setupセルの配列へのindexPath。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("YourTableViewCell") as! YourTableViewCell 

     if array.contains(indexPath) { 
     cell.checkBook.image = UIImage(named: "check") 
     } else { 
     cell.checkBook.image = UIImage(named: "uncheck") 
     } 

     return cell 
} 
0

のUITableViewCellは再利用可能である:

0

セル全体をクリックすると、カスタムセルのsetSelected関数をオーバーライドすることができます。

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    if selected { 
     self.checkBook.image = UIImage(named: "check") 
    } else { 
     self.checkBook.image = UIImage(named: "uncheck") 
    } 
} 
0

私のコードを試してください。ここではselectindexは選択されたセルインデックスを取得するために使用され、selectedindexは選択されたすべてのセル値を格納するNSMutableArrayです。

関連する問題