kitchen800
kitchen800

Reputation: 227

Passing data to various view controllers via delegate

Struggling to learn the basics of passing data via delegates. I am trying to pass a string from my viewController to my viewController2 and print it. I am getting the error:

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

I cannot figure out where I have gone wrong.

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

This is my viewController 2:

class ViewController2: UIViewController, datadelagate {

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

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

Upvotes: 1

Views: 74

Answers (1)

Revanth Kausikan
Revanth Kausikan

Reputation: 673

If you want ViewController2 to print some value from ViewController, you might have to do it this way:

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())
    }
}

Now for some explanation:

For simple understanding, assume a delegate as a person who does some specific job (protocol).

You have a `delegate'

You ask your delegate to work with your friend, and your friend acknowledges. (assigns your delegate by You.delegate = self, where self is your friend)

Now, through your delegate, you can do something with your friend, by asking your delegate to do some job (defined in protocol).


EDIT

The code above won't work, as non-static data members are trying to be accessed without creating an instance


Working code

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
}

Upvotes: 2

Related Questions