ios - 通过委托(delegate)将数据传递给各种 View Controller

标签 ios swift delegates appdelegate

努力学习通过 delegates 传递数据的基础知识.我正在尝试从我的 viewController 传递一个字符串给我的viewController2并打印出来。我收到错误消息:

"Type ViewController2 has no member delagate" in my view controller 2.



我无法弄清楚我哪里出错了。

View Controller 1:
protocol datadelagate {
    func printThisString(string: String)
}

class ViewController: UIViewController {

    var delegate: datadelagate?

    override func viewDidLoad() {
        delegate?.printThisString(string: "This was passed from first controller to second controller")
    }
}

这是我的 View Controller 2:
class ViewController2: UIViewController, datadelagate {

    func printThisString(string: String) {
        print(string)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        ViewController2.delagate = self
        print(String.self)
    }
}

最佳答案

如果你想要ViewController2ViewController 打印一些值,您可能必须这样做:

protocol datadelagate {
    func printThisString(string: String)
    func getStringFromVC1() -> String
}

class ViewController: UIViewController, datadelagate {

    let someString: String = "From VC1"

    func printThisString(string: String) {
        print(string)
    }

    func getStringFromVC1() -> String {
        return someString
    }

    override func viewDidLoad() {
        ViewController2.delagate = self

    }
}
class ViewController2: UIViewController {

    var delegate: datadelagate?

    override func viewDidLoad() {
        super.viewDidLoad()

        //This is how something from VC2 is sent to VC1's scope.
        delegate?.printThisString(string: "Calling the delegate to print something from ViewController2 on first ViewController")

        //The below call gets you some value from VC1. (This is what you wanted, I belive...)
        print(delegate?.getStringFromVC1())
    }
}

现在进行一些解释:

为便于理解,假设 delegate作为从事某些特定工作的人( protocol )。

你有一个“委托(delegate)”

你要求你的委托(delegate)和你的 friend 一起工作,你的 friend 承认了。 (通过 You.delegate = self 分配您的委托(delegate),其中 self 是您的 friend )

现在,通过您的delegate ,您可以通过询问您的delegate 与您的 friend 一起做某事做一些工作(在 protocol 中定义)。

编辑

上面的代码不起作用,因为非静态数据成员试图在不创建实例的情况下被访问

工作代码
import UIKit

class ViewController2: UIViewController {

    static let sharedInstance = ViewController2()
    weak var delegate: DataDelagate?

    override func viewDidLoad() {
        super.viewDidLoad()
        //This is how something from VC2 is sent to VC1's scope.
        delegate?.printThis(string: "Calling the delegate to print something from ViewController2 on first ViewController")

        //The below call gets you some value from VC1. (This is what you wanted, I belive...)
        print(delegate?.getStringFromVC1() ?? "s")
    }
}

class ViewController: UIViewController {

    static let sharedInstance = ViewController2()
    var someString: String = "From VC1"

    override func viewDidLoad() {
        super.viewDidLoad()
        ViewController2.sharedInstance.delegate = self
    }
}
extension ViewController: DataDelagate {
    func printThis(string: String) {
        print(string)
    }

    func getStringFromVC1() -> String {
        return someString
    }
}

protocol DataDelagate: AnyObject {
    func printThis(string: String)
    func getStringFromVC1() -> String
}

关于ios - 通过委托(delegate)将数据传递给各种 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436624/

相关文章:

ios - 大模型 TableView 解决方案 Swift

ios - AppDelegate 中的 UIActivityView 使用协议(protocol)和委托(delegate)

iphone - AVAudioPlayer - 按顺序播放多个音频文件

ios - 处理 iOS 中动态 View 的所有旋转

swift - 使用变量值进行属性查找

swift - 如何在 swift 5 中更新具有不同标识符的不同单元格

swift - 具有关联类型的协议(protocol)中的开放递归有多大限制?

ios - 委托(delegate)方法未被称为 Objective-C

c# - 为什么在将方法分配给委托(delegate)时不添加括号?

ios - 我将如何停止在我的表格 View 中重复加载图像?