2017-10-29 22 views
0

私のiOS Switchアプリでは、各テーブルセルにBEMCheckBoxがあります。セルをデキューするときに呼び出されるデリゲートを設定したいと思います。BEMCheckBoxデリゲートが呼び出されていません

私の問題は、チェックボックスはうまく動作しますが、代理人は決して呼び出されないということです。各チェックボックスにデリゲートを追加するにはどうすればよいですか?

チェックボックスのindexPathを知りたい。計画はモデルオブジェクトをデリゲートに渡し、それに応じてそれを更新することです。

表のセル

let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) 
cell.doneCheckbox.delegate = DoneBEMCheckBoxDelegate() 
return cell 

代理人は、私は:)だから私のデリゲートが後に解放されたことになっているようデリゲートは、checkboxクラスの弱参照であることに気づいた

class DoneBEMCheckBoxDelegate: NSObject, BEMCheckBoxDelegate { 

    @objc func didTap(_ checkBox: BEMCheckBox) { 
     print("Checkbox tapped") 
    } 

} 

答えて

1

cell.doneCheckbox.delegate = DoneBEMCheckBoxDelegate()ローカル変数に新しいDoneBEMCheckBoxDelegateオブジェクトを作成し、デリゲートとしてそれを割り当てています。デリゲートプロパティは弱いので、関数が終了するとすぐに解放されます。これは、強い参照が残っていないためです。

デリゲートとして別のオブジェクトクラスを持つことは、おそらくあなたが望むものではないことをお勧めします。

セルをチェックボックスデリゲートに設定してから、別のプロトコルを宣言して、セルが独自のデリゲートを持つようにします。このデリゲートは、テーブルビューコントローラになります。

protocol MyCellDelegate { 
    func checkBox(for cell: MyCell, isOn: Bool) 
} 

class MyCell: UITableViewCell, DoneBEMCheckBoxDelegate { 

    var delegate: MyCellDelegate? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     self.doneCheckBox.delegate = self 
    } 

    @objc func didTap(_ checkBox: BEMCheckBox) { 
     print("Checkbox tapped") 
     self.delegate?.checkBox(for: self, isOn: checkBox.isOn) 
    } 

} 


class YourViewController: MyCellDelegate { 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     ... 
     cell.delegate = self 

     return cell 
    } 

    func checkBox(for cell: MyCell, isOn: Bool) { 

     guard let indexPath = tableView.indexPath(for: cell) else { 
      return 
     } 
     // Now do whatever you need to with indexPath 
    } 
} 

追加のオブジェクトやデータ構造を作成しないようにしてインデックスパスには依存関係がないように、細胞が再発注されている場合は問題はありませんこの方法です。

+0

デリゲートとセルはこの回答で同じオブジェクトなので、別のライフサイクルを取得するのに問題はありません:) – Mika

0

非常に簡単ですメソッドスコープは終了しました。

デリゲートをビューコントローラに使用中に保存することでこれを解決しました。

var checkboxDelegates: [IndexPath:DoneBEMCheckBoxDelegate] = [:] 
... 
let checkboxDelegate = DoneBEMCheckBoxDelegate(realm: realm, set: set) 
checkboxDelegates[indexPath] = checkboxDelegate 
cell.doneCheckbox.delegate = checkboxDelegate 
関連する問題