swift委托beetween两个视图控制器没有segue

use*_*075 6 cocoa-touch delegates ios swift

我的委托协议从未调用过

我的第一个控制器--ViewController

class ViewController: UIViewController,testProtocol {

    @IBAction func btInit(sender: AnyObject) {
        println("Bt Init")

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let initViewController: UIViewController = storyBoard.instantiateViewControllerWithIdentifier("viewTarget") as targetViewController
        self.presentViewController(initViewController,animated: false, nil)

    }

    var targetController = targetViewController();

    override func viewDidLoad() {
        super.viewDidLoad()
        self.targetController.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func testDelegate(){
        println(" in my view controller delegate ")
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的第二个视图控制器 - targetViewController

protocol testProtocol {
    func testDelegate() // this function the first controllers
}

class targetViewController: UIViewController {

    @IBAction func BtTarget(sender: AnyObject) {

        println("bt target pressed")

        delegate?.testDelegate()
    }

    var delegate : testProtocol?

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

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

    func testDelegate(){
        println(" in my target view controller delegate ")
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么testDelegate()从未在ViewController上调用过?我究竟做错了什么?谢谢.

我已经阅读了很多关于此的帖子,但所有的例子都是通过segue过渡给出的,我不想使用segue.

tre*_*orj 11

通常,您在中设置新的视图控制器的委托属性prepareForSegue:.你说你没有使用segue,所以你需要实例化第二个视图控制器并以某种方式呈现它.您可以通过执行以下操作来执行此操作:

let storyboard = UIStoryboard(name: "AStoryboardName", bundle: nil)
let secondVC = storyboard.instantiateViewControllerWithIdentifier(anIdentifier) as! targetViewController
secondVC.delegate = self
presentViewController(secondVC, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

testDelegate()两个视图控制器中都有一个方法,但您只需要在第一个视图控制器中.然后你的第二个视图控制器可以delegate?.testDelegate()在适当的时候调用.

最后,您通常希望将委托属性设置为弱,因此我建议您更改var delegate : testProtocol?weak var delegate: testProtocol?

我会读一下代表团.这是一个相对简单的5步授权过程,可以帮助您:

5个步骤的代表团:

对象A是对象B的委托,对象B将发送消息:

  1. 为对象B定义委托协议.
  2. 为对象B提供可选的委托变量.这个变量应该很弱.
  3. 当有趣的事情发生时,让对象B向其委托发送消息,例如用户按下取消或完成按钮,或者当需要一条信息时.
  4. 使对象A符合委托协议.它应该将协议的名称放在其类行中,并从协议中实现方法.
  5. 告诉对象B对象A现在是它的委托(在prepareForSegue(sender)中).

  • 你好!首先,谢谢.你的解释很棒.但如果两者之间有VC呢?例如,VC1呈现VC2,其呈现VC3.VC3希望VC1做一些工作.如果没有segue和VC2中的程序化VC3调用,你如何进行第5步!?! (3认同)