我试图在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,只是不确定为什么它没有。
答案 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。