Swift 5:尝试设置委托,但函数未启动

Swift 5: Trying to set up a delegate, but the function isn't launching

我正在尝试实现一个委托函数,当您单击 tableView 内的单元格时,该 tableView 将在初始 ViewController 上调用委托函数。出于某种原因,这是行不通的。

(我应该注意,我在自定义 .xib 文件中设置了另一个委托,它将要求原始视图控制器执行 segue)

所以我现在实现代码的方式是 ViewControllerA 加载其中包含自定义单元格的 tableView。这些自定义单元格中的每一个都有一个按钮,我可以在其中调用放置在 ViewControllerA 中的委托函数,以对名为 FCSViewController 的第三个视图控制器执行转接。当您单击 FCSViewController 中的一个 tableCell 时,它应该在 ViewControllerA 中调用一个委托函数,然后再从堆栈中弹出,但从来没有这样做。

这是我的实现:

ViewController答:

class ViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

let fcsViewController = FCSViewController()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
   
    fcsViewController.delegate = self
    
    tableView.dataSource = self
    tableView.delegate = self
    tableView.register(UINib(nibName: "hourlyEntry", bundle: nil), forCellReuseIdentifier: "TimeLabel")
    
    tableView.backgroundColor = .white
    
    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 90
    
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 24
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TimeLabel", for: indexPath) as! hourlyEntry
    cell.timeLabel.text = "\(indexPath.row):00"
    cell.delegate = self

    return cell
}

func performSegueFromTableCell(withIdentifier identifier: String) {
    performSegue(withIdentifier: identifier, sender: nil)
}}

ViewControllerA 的扩展名:

extension ViewController : FCSSelectorDelegate {
func editSelectedCell(FCSScore: Int, cellToEdit: Int) {
    print("get the damn delegate!")
}}

这是我的 FCSViewController:

enter code hereprotocol FCSSelectorDelegate : class {
func editSelectedCell(FCSScore: Int, cellToEdit: Int)}

class FCSViewController: UITableViewController {

var editingCell = Int()

weak var delegate : FCSSelectorDelegate?

override func viewDidLoad() {
    super.viewDidLoad()

    
    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

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


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = "blah"
    cell.textLabel?.numberOfLines = 0
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    delegate?.editSelectedCell(FCSScore: indexPath.row, cellToEdit: editingCell)
    print("Sending delegate")
    tableView.deselectRow(at: indexPath, animated: true)
    self.navigationController?.popViewController(animated: true)
}

}

ViewControlerA 的委托函数从不触发。我还从 this question 做了断点,我发现委托设置得很好,(我假设在调试菜单中看到这个:delegate INIM_Activty_Log.FCSSelectorDelegate? 0x00007fcb17a08a70,但是当我做断点时当从 FCSViewController 调用委托函数时,委托现在为 nil。我曾尝试在 ViewControllerA 的 deinit 函数中实现断点,但它从未触发。

感谢您的帮助!我想和代表们相处得更好,但他们就是不喜欢我!!

这个...

let fcsViewController = FCSViewController()

...创建一个 FCSViewController 的实例,你永远不会用 做任何事情,除了 设置委托。

由于您正在使用 segue 来显示 FCSViewController 实例,因此您需要在作为 segue 目标的那个上设置委托。实施 prepareForSegue 并在那里设置委托。

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621490-prepareforsegue

你有 customCell class 吗?你是从那个 class 调用委托吗? 因为点击的按钮应该有那里的功能并调用委托。

自定义 class 应该是这样的: CustomClass.Swift

// Define the protocols for custom cell
protocol customTableCellControllerProtocol: class {
    func editSelectedCell(FCSScore: Int, cellToEdit: Int)
}

// Custom cell class
class customTableCellController: UITableViewCell {

   var cellDelegate: ReviewCollectionViewCellProtocol?

   // FOLLOWING YOU SHOULD HAVE THE BUTTON FUNCTION
   // WHEN CLICKED WILL CALL THE PROTOCOL. FOR EXAMPLE:

   func theButton(_ sender: Any) {
        // With this line the extension protocols in ViewControllerAshould be properly activated. 
        cellDelegate?.editSelectedCell(FCSScore: Int, cellToEdit: Int)
    }


}

并且在 ViewController.swift

代替

extension ViewController : FCSSelectorDelegate {
func editSelectedCell(FCSScore: Int, cellToEdit: Int) {
    print("get the damn delegate!")
}}

更改为

extension ViewController : customTableCellControllerProtocol {
func editSelectedCell(FCSScore: Int, cellToEdit: Int) {
    // YOU CAN PERFORM THE SEGUE HERE
}}

添加所有应触发 ViewControllerA 中的扩展协议的内容。 如果我有错误的想法,请告诉我这是否有效或更多信息。 祝你好运!