无需 prepareForSegue 的 Swift 代理

4

我刚开始学习 SwiftiOS 开发。我有两个类想要连接起来。我没有使用 prepareForSegue。这是我的代码,但是肯定哪里出了问题。

protocol TimeDelegate{
 func timerDidFinish()
}


class Timer: UIViewController {

// this is where we declare our protocol
var delegate:TimeDelegate?

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 timeFired(sender: UIButton){

    delegate?.timerDidFinish()

}

}


import UIKit


class ViewController: UIViewController, TimeDelegate {

var timer:Timer = Timer()

override func viewDidLoad() {
    super.viewDidLoad()

}

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

func timerDidFinish(){

    println("Delegate is working")
}

}

由于某种原因,timerDidFinish 没有触发。

你从未给委托赋值。 - Arbitur
@Arbitur 谢谢,我已经将timer.delegate设置为self,但仍然没有触发。 - Imma
delegate?.timerDidFinish() 这里的 delegate 是 nil 吗?请检查一下。 - Amit89
你是如何呈现计时器视图控制器的?你呈现的实例几乎肯定不是你分配并赋给属性的那个实例。你可能需要在 prepareForSegue 中设置代理。 - Paulw11
你不应该将委托分配给self - 它必须分配给ViewController - Petar
1个回答

7

根据您的解释,我了解到这两个UIViewControllers没有任何关联。

当您点击按钮来触发@IBAction func timeFired(sender: UIButton){..}函数时,您将会进入TimerUIViewController。

那么,什么时候实例化ViewController?如果不实例化它,委托就永远不会被设置。

如果您只想调用timerDidFinish()函数并且与ViewController无关,则可以这样做:

class Timer: UIViewController {

var delegate:TimeDelegate?

override func viewDidLoad() {
super.viewDidLoad()
var vc = ViewController()
self.delegate = vc

}

然后你的函数将被调用。

感谢大家的贡献。谢谢 @Raja Vikaram,现在它可以工作了。 - Imma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接