2017-10-29 1 views
0

내 iOS 스위치 응용 프로그램에서 각 테이블 셀에 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 
관련 문제