Swift - 委托函数没有返回值

Swift - Delegate function not returning value

VC-A 嵌入在导航控制器中,并有一个按钮通过弹出框转至 VC-B。 VC-B 有一个带有一些字体名称的 table 视图。当我 select 字体名称时,VC-B 关闭,使用 delegate/protocol,VC-A 应该得到 selected 名称。它不是。我发现如果我在 didSelectRowAt 的末尾设置断点,由于某种原因,委托为 nil。

VC-A

class ViewController: UIViewController, FontDelegate {
    @IBOutlet weak var infoLabel: UILabel!
    let fontTable = FontTableTableViewController()

    override func viewDidLoad() {
        super.viewDidLoad()
        fontTable.delegate = self
    }
    
    func getFontName(data: String) {
        infoLabel.text = data
    }
}

VC-B

protocol FontDelegate {
    func getFontName(data: String)
}
    
class FontTableTableViewController: UITableViewController {

   let fontArray = ["Helvetica", "Arial", "Monaco"]
   var delegate: FontDelegate?

   // MARK: - Table view functions go here...

   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      let font = fontArray[indexPath.row]
      self.delegate?.getFontName(data: font)
      self.dismiss(animated: true, completion: nil)
   }
}

这显示了从 VC-A 中的按钮到 VC-B 的故事板连接。

与其将 Pick your font 按钮链接到另一个控制器,我建议您创建按钮的 IBAction 以在按下时触发以下代码:

let storyBoard = UIStoryboard(name: "Main", bundle: nil)
guard let vc = storyBoard.instantiateViewController(withIdentifier: "FontScreen") as? FontTableTableViewController else {return}
vc.delegate = self
vc.modalPresentationStyle = .fullScreen
self.navigationController?.pushViewController(vc, animated: true)

但要使其正常工作,您需要前往 FontTableTableViewController 的身份检查员,然后您可以在 Identity 部分的 storyboardID 字段中将您的控制器命名为 FontScreen.

这不是在导航控制器环境中 return 变量的方法。我想建议你使用 unwind segue。您的代码将如下所示:

VC一个

class ViewController: UIViewController {

    var selectedFontName = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    @IBAction func returnSelectedFont(sender: UIStoryboardSegue) {
        print(selectedFontName)
    }

}

VCA 中的 IBAction 也是 tableview returns 的方法,如果你使用 unwind segue。

您的 tableview 控制器看起来像这样: VC乙

import UIKit

class FontTableTableViewController: UITableViewController {

    var selectedFont = ""
    let fontArray = ["Helvetica", "Arial", "Monaco"]
    @IBOutlet var fontTable: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        fontTable.dataSource = self
        fontTable.delegate = self
    }

    // MARK: - Table view data source
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return fontArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FontTable", for: indexPath) as! FontCell

        cell.fontName.text = fontArray[indexPath.row]

        return cell
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        selectedFont = fontArray[indexPath.row]
        performSegue(withIdentifier: "Return Fontname", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let returnVC = segue.destination as? ViewController {
            returnVC.selectedFontName = selectedFont
        }
    }
}

为了能够让 return segue 正常工作,您必须 select tableview 单元格并控制将其拖动到 tableview 控制器中的退出图标。所以看图

在那之后你 select 展开 segue 并给它一个标识符,在 VC B 中使用。见代码。

这应该可以完美运行。

亲切的问候, MacUserT