Ios 不带segue的两视图控制器之间的swift委托 我的代理从未打过电话

Ios 不带segue的两视图控制器之间的swift委托 我的代理从未打过电话,ios,swift,cocoa-touch,delegates,Ios,Swift,Cocoa Touch,Delegates,我的第一个控制器-ViewController class ViewController: UIViewController,testProtocol { @IBAction func btInit(sender: AnyObject) { println("Bt Init") let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil) let init

我的第一个控制器-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 ")
    }
}
在我的第二个视图控制器-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 ")
    }
}
为什么从来没有在ViewController上调用testDelegate()?我做错了什么?谢谢


我读过很多关于这方面的帖子,但是所有的例子都是关于segue transition的,我不想使用segue

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

let storyboard = UIStoryboard(name: "AStoryboardName", bundle: nil)
let secondVC = storyboard.instantiateViewControllerWithIdentifier(anIdentifier) as! targetViewController
secondVC.delegate = self
presentViewController(secondVC, animated: true, completion: nil)
在两个视图控制器中都有一个
testDelegate()
方法,但您只希望在第一个视图控制器中使用它。然后,您的第二个视图控制器可以在适当的时间调用
delegate?.testDelegate()

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

我会仔细阅读有关代表团的资料。以下是一个相对简单的5步授权流程,可以帮助您:

分5步委派:

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

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

  • @user2718075太好了,很高兴听到!你好!首先,谢谢。你的解释很好。但是如果两者之间有风险投资呢?例如,VC1表示VC2,后者表示VC3。VC3希望VC1做一些工作。在VC2中没有segue和编程VC3调用的情况下,如何执行步骤#5!?!