首页 > 解决方案 > Swift 4.2:无法让简单的委托协议工作

问题描述

我的工作流程的 YouTube 屏幕记录

第一视图控制器

import UIKit

class FirstViewController: UIViewController {
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let secondViewController = SecondViewController()
        secondViewController.delegate = self
    }
}

extension FirstViewController: DataEnteredDelegate {
    func userDidEnterInformation(info: String) {
        label.text = info
        print("label changed")
    }
}

第二视图控制器

import UIKit

protocol DataEnteredDelegate: class {
    func userDidEnterInformation(info: String)
}

class SecondViewController: UIViewController {
    weak var delegate: DataEnteredDelegate? = nil

    @IBOutlet weak var textField: UITextField!

    @IBAction func sendTextBackButton(_ sender: UIButton) {
        print("button tapped")
        delegate?.userDidEnterInformation(info: textField.text!)
    }
}

标签: iosswift

解决方案


除了缺少代表收养

class FirstViewController: UIViewController, DataEnteredDelegate {

如果视图控制器是在情节提要中设计的,它就无法工作。

线

let secondViewController = SecondViewController()

创建一个全新的实例,SecondViewController该实例不是情节提要中的实例,并且所有出口都未连接。

您必须使用segue,或者您必须实例化并呈现第二个视图控制器以获取对目标控制器的真实引用。

笔记:

就 Swift 协议/委托而言,在控制器之间共享数据是相当客观的
回调闭包更轻量级和更快捷


推荐阅读