我的第一个控制器 - 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。
答案 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将发送消息: