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

时间:2015-07-04 15:28:17

标签: 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 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上调用过?我究竟做错了什么?感谢。

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

1 个答案:

答案 0 :(得分:10)

通常,您在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()

最后,您通常希望委托属性较弱,因此我建议您将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)中)。