swift 在没有 segue 的情况下在两个视图控制器之间进行委托

swift delegate beetween two view controller without 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 ")
    }
}

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

我已经阅读了很多关于这个的帖子,但是所有的例子都是用 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()

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

我会仔细阅读授权。这是一个相对简单的 5 步授权过程,可能会对您有所帮助:

分 5 步委派:

对象A是对象B的代理,对象B将发出消息:

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