从协议中委派函数未被调用

时间:2016-10-01 06:43:14

标签: ios delegates protocols swift3

我有一个以前工作过的委托和协议,因为不再调用转换为Swift 3。

protocol TaskCellDelegate {
    func doneHit(_ cell : TaskCell)
}

class TaskCell : UITableViewCell {

    var delegate : TaskCellDelegate?

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var detailLabel: UILabel!
    @IBOutlet weak var _checkBox: M13Checkbox!


    override func awakeFromNib() {
        super.awakeFromNib()
        let tap = UITapGestureRecognizer(target: self, action: #selector(TaskCell.buttonClicked(_:)))
        tap.numberOfTapsRequired = 1
        _checkBox.addGestureRecognizer(tap)
        _checkBox.isUserInteractionEnabled = true
        _checkBox.markType = .checkmark
        _checkBox.boxType = .circle
        _checkBox.stateChangeAnimation = .expand(.fill)
    }
    func buttonClicked(_ sender:UITapGestureRecognizer) {
        delegate?.doneHit(self)
    }
}

正如你所看到的,当点击_checkBox时,它应该在我的类中调用函数doneHit(没有添加,因为它似乎没有必要,但我可以)但我设置了一个断点,它从来没有调用。我已经设置了我的代表并且符合我班级的协议,但没有任何事情发生。 doneHit函数应该更新我的后端,但它没有被调用。如果您需要更多信息,我可以提供。

修改1:

class TasksTVC: UITableViewController, TaskCellDelegate {

    func doneHit(_ cell:TaskCell) {
        if let indexPath = self.tableView.indexPath(for: cell) {
            task = tasksInSectionArray[indexPath.section][indexPath.row]
            if task.done == false {
                cell._checkBox.setCheckState(.checked, animated: true)
                task.done = true
                task.completedBy = user
                cell.detailLabel.text = "Completed By: \(task.completedBy)"
                cell.label.textColor = UIColor.gray
                print("cell checked")
            }
            else {
                cell._checkBox.setCheckState(.unchecked, animated: true)
                task.done = false
                task.completedBy = ""
                cell.detailLabel.text = ""
                cell.label.textColor = UIColor.black
                print("cell unchecked")

            }
            fb.updateTaskDoneBool(ref, taskID: task.id, taskDone: task.done)
            fb.updateTaskCompletedBy(ref, taskID: task.id, taskCompletedBy: task.completedBy)
        }

    }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell
        cell.selectionStyle = .none
        task = tasksInSectionArray[indexPath.section][indexPath.row]
        cell.label.text = task.title
        if task.done == true {
            cell._checkBox.setCheckState(.checked, animated: true)
            cell.detailLabel.text = "Completed By: \(task.completedBy)"
            cell.label.textColor = UIColor.gray
        }
        else {
            cell._checkBox.setCheckState(.unchecked, animated: true)
            cell.detailLabel.text = ""
            cell.label.textColor = UIColor.black

        }
        doneHit(cell)
        cell.delegate = self
        return cell
    }}

2 个答案:

答案 0 :(得分:2)

看起来您没有正确设置delegate实例中的TaskCell属性,我将提供一个非常基本的示例,希望它可以帮助您解决问题:

结果(已编辑)

代码

<强> TableViewController

import UIKit

protocol TaskCellDelegate {
  func doneHit(_ cell: TaskCell)
}

class TableViewController: UITableViewController, TaskCellDelegate {
  func doneHit(_ cell: TaskCell) {
    let alert = UIAlertController(
                    title: "Info",
                    message: "button touched in cell",
                    preferredStyle: .alert
                )
    present(alert, animated: true, completion: nil)
  }
}

extension TableViewController {
  override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
  }

  override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TaskCell
    cell.delegate = self // probably you forgot to set this part?

    return cell
  }
}

TaskCell (已编辑)

而是创建一个新的UITapGestureRecognizer以附加到复选框,您可以使用addTarget方法为UIControlEvents.valueChanged值附加事件处理程序。

import UIKit
import M13Checkbox

class TaskCell: UITableViewCell {

  var delegate: TaskCellDelegate?

  @IBOutlet weak var checkbox: M13Checkbox!

  override func awakeFromNib() {
    super.awakeFromNib()

    checkbox.addTarget(self, action: #selector(buttonClicked), for: .valueChanged)
  }


  func buttonClicked() {
    delegate?.doneHit(self)
  }

}

答案 1 :(得分:0)

如果没有调用委托,则存在以下情况:

  1. 操作:buttonClicked未被调用。
  2. 视图控制器不符合协议。

    class ViewController: UIViewController, TaskCellDelegate {
    
  3. 在View Controller中未实现的协议方法。

    func doneHit(_ cell : TaskCell) {
        print("delegate implementation called")
    }
    
  4. 未在cellForRowAtIndexPathMethod:

    中分配代理
    cell.delegate = self