Search code examples
iosswiftdelegatesprotocols

Protocol Delegate Does not Trigger Swift


I want to trigger MultipleAnswerTableViewCell's mainSaveTapped func when the IBAction saveButton tapped.

Here is my class with the protocol

protocol AddQuestionViewControllerDelegate: AnyObject {
    func mainSaveTapped()
}

class AddQuestionViewController: BaseViewController, MultipleAnswerTableViewCellDelegate, UITextFieldDelegate {

weak var delegate: AddQuestionViewControllerDelegate?

 @IBAction func saveTapped(_ sender: UIButton) {
        delegate?.mainSaveTapped()
}

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch cellTypes[indexPath.row] {
    case .fixedTop: return configureFixedTop(indexPath: indexPath)
    case .multiAnswer: return configureMultiAnswerCell(indexPath: indexPath)
    case .singleAnswer: return configureSingleAnswerCell(indexPath: indexPath)
    case .textAnswer: return configureTextAnswerCell(indexPath: indexPath)
    }
}



func configureMultiAnswerCell(indexPath: IndexPath) -> MultipleAnswerTableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "MultipleAnswerTableViewCell") as! MultipleAnswerTableViewCell
        cell.parentVC = self
        cell.answerDelegate = self
        cell.setupMultipleAnswerView()
        return cell
    }

And this is my MultipleAnswerTableViewCell

protocol MultipleAnswerTableViewCellDelegate: AnyObject {
    func sendAnswers(surveyAnswers: [SurveyAnswer])
}

class MultipleAnswerTableViewCell: UITableViewCell, AddQuestionViewControllerDelegate, UITextFieldDelegate {

weak var answerDelegate: MultipleAnswerTableViewCellDelegate?

 func mainSaveTapped() {
        checkPostShare()
    }

My func mainSaveTapped never triggered hence checkPostShare never called. What should I do to trigger mainSaveTapped func inside the MultipleAnswerTableViewCell


Solution

  • You don't assign a value to the delegate property inside the vc

    weak var delegate: AddQuestionViewControllerDelegate?
    

    So here delegate? is nil

    @IBAction func saveTapped(_ sender: UIButton) {
        delegate?.mainSaveTapped()  // delegate? is nil
    }
    

    You need to send a message from the vc to the cell , here you don't need a delegate ,instead

     @IBAction func saveTapped(_ sender: UIButton) { 
       (tableView.visibleCells as? [MultipleAnswerTableViewCell])?.forEach { cell in
         cell.mainSaveTapped()
       } 
    }