两个视图控制器之间的快速代表没有segue

我的委托协议从来没有调用

我的第一个控制器 – 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 ") } } 

为什么testDelegate()永远不会调用ViewController? 我究竟做错了什么? 谢谢。

我已经阅读了很多关于这个的post,但是所有的例子都是用segue过渡的,我不想用segue。

通常你在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) 

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

最后,您通常希望使委托属性变弱,所以我build议更改var delegate : testProtocol? weak var delegate: testProtocol?

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

5个步骤的代表团:

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

  1. 定义对象B的委托协议
  2. 给对象B一个可选的委托variables。 这个variables应该很弱。
  3. 当有些事情发生时,使对象B向其代理发送消息,例如用户按下“取消”或“完成”button,或者当需要一条信息时。
  4. 使对象A符合委托协议。 它应该把协议的名称放在它的类中,并且实现协议中的方法。
  5. 告诉对象B对象A现在是它的委托(在prepareForSegue(sender)中)。