通过委托将数据传递给各种视图控制器

时间:2019-12-21 13:36:44

标签: ios swift delegates appdelegate

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

  
    

我的ViewController2中的“类型delagate没有成员view controller 2”。

  

我无法弄清楚哪里出了问题。

viewController 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")
    }
}

这是我的viewController 2:

class ViewController2: UIViewController, datadelagate {

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

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

1 个答案:

答案 0 :(得分:2)

如果您希望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)。

您有一个“代表”

您要求您的代表与您的朋友一起工作,并且您的朋友承认。 (通过You.delegate = self指派您的代表,而自我是您的朋友)

现在,通过您的delegate,您可以要求您的delegate做一些工作(在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
}