2016-10-01 2 views
2

У меня есть ранее работающий делегат и протокол, так как преобразование в 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 должна обновлять мои бэкэнды, но не вызывать их. Если вам нужна дополнительная информация, я могу предоставить.

Edit 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 
    }} 
+1

Вызывается 'buttonClicked'? Покажите свой метод cellForRowAtindexPath. –

ответ

1

Похоже, ты правильно 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 (Edited)

Вместо создания нового 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) 
    } 

} 
+0

Это не учитывает, что я вызвал buttonClicked как действие на моем распознавателе жестов. Это означает, что у меня есть кнопка, созданная в IB, и я использую это, чтобы отключить функцию. –

+0

@MichaelWilliams Я обновил свой ответ. – Wilson

0

Существуют следующие случаи, если делегат не называют:

  1. Действие: buttonClicked не вызывается.
  2. Контроллер просмотра не соответствует протоколу.

    class ViewController: UIViewController, TaskCellDelegate { 
    
  3. Метод протокола, не реализованный внутри контроллера просмотра.

    func doneHit(_ cell : TaskCell) { 
        print("delegate implementation called") 
    } 
    
  4. делегат не назначен в cellForRowAtIndexPathMethod:

    cell.delegate = self 
    
+0

См. Правки. Я сделал все это. Вся эта ситуация работала очень хорошо, прежде чем я перешел на быстрый 3. –

Смежные вопросы