代表返回零

时间:2015-03-13 18:49:27

标签: xcode swift delegates protocols

我试图在swift中使用协议/委托,虽然我没有收到任何错误但似乎我的委托没有被创建。

这是我的代码

第1类

import UIKit

protocol GameViewSliding{
    func slideGameView()
}

class GameDetailsViewController: UIViewController {

    var delegate:GameViewSliding?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

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

    @IBAction func showOptions(sender: AnyObject) {

        println("button pressed")
        println(delegate)
        delegate?.slideGameView()
    }

}

符合协议的第2类

import UIKit

var currentHoleNumber:Int = 0
var parThree = false;
var parFive = false;

class GameViewController: UIViewController,  GameViewSliding{


var gameDetailsVC:GameDetailsViewController = GameDetailsViewController()
    override func viewDidLoad() {
        super.viewDidLoad()

        println("inside the game class")
        gameDetailsVC.delegate = self
    }

    func slideGameView(){
        println("this is from the root controller")
    }

}

代表回来了,这就是为什么我从来没有从Class2获得println,只是不确定为什么它没有。

3 个答案:

答案 0 :(得分:1)

您必须在GameViewController中向类GameDetailsViewController设置引用,并在以下方式设置delegate

gameDetailsViewController.delegate = self

并且代理不是nil,当然是在prepareForSegue中设置引用或者用于呈现其他ViewController的任何其他方法。

答案 1 :(得分:1)

我注意到在使用SplitViewController时设置委托时存在一些问题。 splitViewController中的detailVC可以这样获取:

override func viewDidLoad() {
    super.viewDidLoad()
    let detailNavigationController = splitViewController?.viewControllers[1] as! UINavigationController
    let detailVC = detailNavigationController.topViewController as! DetailViewController

    detailVC.delegate = self
}

另一种方法是在AppDelegate中设置委托,配置SplitViewController后面的行:

let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController
let masterVC = masterNavigationController.topViewController as! MasterViewController
let detailNavigationController = splitViewController.viewControllers[1] as! UINavigationController
let detailVC = detailNavigationController.topViewController as! DetailViewController

detailVC.delegate = masterVC

答案 2 :(得分:0)

我也遇到了这个问题。并且我检查了我是否已经实现了该协议,让VC符合该协议,创建该协议的委托。我唯一忘记做的就是将第二个VC的委托设置为第一个VC时将标识符设置为segue。