Pass data when dismiss modal viewController in swi

2019-02-01 02:07发布

I'm trying to pass data from the modal ViewController to his source ViewController. I think I have to use delegation but it doesn't work.

protocol communicationControllerCamera{
    func backFromCamera()
}

class Camera: UIViewController{
    var delegate: communicationControllerCamera

    init(){
        self.delegate.backFromCamera()
    }
}


class SceneBuilder: UIViewController, communicationControllerCamera{
    func backFromCamera(){    // Never called
        println("YEAHH")
    }
}

The backFromCamera method it's not called. What did I do wrong?

2条回答
Explosion°爆炸
2楼-- · 2019-02-01 02:30

You didn't set a delegate so it was empty when you tried to call backFromCamera().

Here's a simple working example you can test out. Notice the use of the optional type (?) for the delegate.

// Camera class
protocol communicationControllerCamera {
    func backFromCamera()
}

class Camera: UIViewController {
    var delegate: communicationControllerCamera? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate?.backFromCamera()
    }
}



// SceneBuilder class
class SceneBuilder: UIViewController, communicationControllerCamera {

   override func viewDidLoad() {
       super.viewDidLoad()
   }

   override func viewDidAppear(animated: Bool) {
       super.viewDidAppear(animated)

       var myCamera = Camera()
       myCamera.delegate = self

       self.presentModalViewController(myCamera, animated: true)
   }

   func backFromCamera() {
       println("Back from camera")
   }
}

You can find all the information you need in Apple's Swift documentation.

查看更多
来,给爷笑一个
3楼-- · 2019-02-01 02:34

Obviously the chosen answer is correct, but it didn't help me. I did successfully implement protocols though, so I wanted to provide my own explanation in case anyone is struggling with grasping the concept, like I was.

Protocol Code Is Written in Three Places:

  • Two ViewController Classes
  • The Protocol itself (code written outside of VC classes)

When I write my protocols, I put them in my "ToolBox" document and I still write comments to remind myself which VCs are doing what. Two examples:

1. Main Protocol code

So there is always:

  1. The protocol code (shown above)
  2. Code in a VC which initiates the action
  3. Code in a VC which is delegated to carry out the action

1. The protocol code

See the image above for a reference. Essentially, the protocol code is just where you give the protocol a name and declare what functions you want to remotely call/delegate to. Name the protocol. Declare the names of the functions that can be called upon and declare their parameter types such as string, etc.

2. Code in a VC which initiates the action

This is the code that initiates the protocol. In this example, this is code from a table cell, which needs to delegate some work back to the main table VC. The first screenshot shows the creation of the delegate variable and the second screenshot is the actual use of that variable.

enter image description here

So the below code are table-cell buttons. They all need to trigger code outside of the cell VC, so they all trigger functions using the protocol I declared above.

enter image description here

3. Code in a VC which is delegated to carry out the action

Now the protocol is being called, but which VC answers the call? To answer that question, choose the VC and add the protocol name to the class declaration:

enter image description here

Lastly, you need the actual meat of the whole thing. Not the trigger, not the protocol itself, not the class declaration... but the actual function you want to call:

enter image description here

Hope This Helps

I don't know why protocols just wouldn't sink through my thick skull but they wouldn't. I hope this helps others like me!

查看更多
登录 后发表回答