问题
I have two controllers
VC A
-> Parent
and VC B
-> Child
Alert view delegate method i.e
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int){}
is declared in VC A
.
When i display alert from VC B
delegate method is not called on alert button clicked.
回答1:
protocol alertViewDelegate:class {
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int)
}
Create an alert view delegate object in parent class VC A
weak var delegate:alertViewDelegate() ?= nil
Implement the delegate in VC B and Set the delegate object in VC B
let alertview = alertView()
alertview.delegate = self
回答2:
You are setting AlertView
delegate to self, Self means Child
, Change delegate to VC A.
alertView.delegate = self.parent?.parent
回答3:
Follow these step by step:
Create a protocol in your VC-B as:
protocol AlertViewProtocol:class { func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) }
Add a var in your VC-B class as:
var delegate: AlertViewProtocol?
Use the delegate in any class method of VC-B to send the data to the receiving method (i.e. any method of VC-A), which is any method that adopts the protocol. Follow this pattern to use the delegate:
delegate?.alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) // Above statement is like a method calling (on delegate var), use your parameters accordingly
Adopt the protocol in your recieving class (here, VC-A):
class ViewControllerA: UIViewController, AlertViewProtocol { ... ... }
Implement the delegate method in VC-A:
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // Do your stuff // when you click on the designated button in your VC-B, this method will be invoked }
Set the delegate in VC-A where you are instantiating the VC-B object. In my case this is like:
Here,
vcb?.delegate = self
is very important. If you forget to set the delegate property of the object withself
the delegation process won't work.
@IBAction func showVCB(sender: AnyObject) {
let vcb: ViewControllerB? = self.storyboard?.instantiateViewControllerWithIdentifier("viewcontrollerB") as? ViewControllerB
vcb?.delegate = self
self.presentViewController(vcb!, animated: true, completion: nil)
}
Hope, this helps you for understanding the process of how the delegates work.
来源:https://stackoverflow.com/questions/41670544/uialertview-delegate-method-not-calling-in-child-view-controller