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将发出消息:
- 为对象 B 定义委托协议。
- 给对象B一个可选的委托变量。这个变量应该是弱的。
- 让对象 B 在发生有趣的事情时向其委托发送消息,例如用户按下“取消”或“完成”按钮,或者当它需要一条信息时。
- 使对象A符合委托协议。它应该将协议的名称放在其 class 行中并实现协议中的方法。
- 告诉对象 B,对象 A 现在是它的委托(在 prepareForSegue(sender) 中)。
我的委托协议从未调用过
我的第一个控制器 - 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将发出消息:
- 为对象 B 定义委托协议。
- 给对象B一个可选的委托变量。这个变量应该是弱的。
- 让对象 B 在发生有趣的事情时向其委托发送消息,例如用户按下“取消”或“完成”按钮,或者当它需要一条信息时。
- 使对象A符合委托协议。它应该将协议的名称放在其 class 行中并实现协议中的方法。
- 告诉对象 B,对象 A 现在是它的委托(在 prepareForSegue(sender) 中)。