单击一个按钮时如何发送事件
Posted
技术标签:
【中文标题】单击一个按钮时如何发送事件【英文标题】:how to send event when one button clicked 【发布时间】:2017-01-13 12:46:02 【问题描述】:我创建了 UIAlertView,它有 2 个正按钮和负按钮。 AlertView 也是视图控制器。
我正在从 Main viewController 打开 AlertVC。
这是我的 AlertVC
class AlertVC: UIViewController
var transitioner : CAVTransitioner
@IBOutlet weak var alertPositiveBtn: IFOButton!
@IBOutlet weak var alertNegativeBtn: IFOButton!
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
self.transitioner = CAVTransitioner()
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
self.modalPresentationStyle = .custom
self.transitioningDelegate = self.transitioner
convenience init()
self.init(nibName:nil, bundle:nil)
required init?(coder: NSCoder)
fatalError("NSCoding not supported")
@IBAction func postiveBtnPressed(_ sender: IFOButton)
@IBAction func negativeBtnPressed(_ sender: IFOButton)
@IBAction func closeBtnPressed(_ sender: UIButton)
self.presentingViewController?.dismiss(animated: true, completion: nil)
我想要什么:我希望 MainViewController 以某种方式检测按下哪个按钮是负的还是正的。
有人能告诉我怎么做吗?
更新:使用委托模式后
@IBAction func positiveBtnPressed(_ sender: IFOButton)
delegate?.positiveBtnPressed(onAlertVC: self)
self.presentingViewController?.dismiss(animated: true, completion: nil)
@IBAction func negativeBtnPressed(_ sender: IFOButton)
delegate?.negativeBtnPressed(onAlertVC: self)
self.presentingViewController?.dismiss(animated: true, completion: nil)
这是我在 MainViewController 上所做的
class MainViewController: UIViewController, AlertVCDelegate
这是我的功能
func positiveBtnPressed(onAlertVC: IFOAlertVC)
print("Pos")
func negativeBtnPressed(onAlertVC: IFOAlertVC)
print("Neg")
它仍然没有被调用。
【问题讨论】:
请给标签值 alertPositiveBtn 和 alertNegativeBtn 你可以在你的控制器上传递这个标签值 您可以使用delegate/protocol
。
【参考方案1】:
这是delegate pattern 的教科书示例。
向您的 AlertVC 添加协议:
protocol AlertVCDelegate : class
func positiveBtnPressed(onAlertVC: AlertVC)
func negativeBtnPressed(onAlertVC: AlertVC)
然后在您的 AlertVC 类中创建一个 weak
属性并将按钮按下传递给它:
class AlertVC : UIViewController
weak var delegate: AlertVCDelegate?
...
@IBAction func postiveBtnPressed(_ sender: IFOButton)
delegate?.positiveBtnPressed(onAlertVC: self)
@IBAction func negativeBtnPressed(_ sender: IFOButton)
delegate?.negativeBtnPressed(onAlertVC: self)
在您的MainViewController
中实现AlertVCDelegate
协议,并在您从MainViewController
呈现AlertVC
时设置delegate
。
如果您从 segue 中显示警报 vc,请使用 prepare(for: sender:)
方法将 MainViewController
设置为委托。
【讨论】:
@David Ganster 感谢您的回答。我完全按照你说的做了,但没有调用 MainViewController 上的函数。有什么我可以错过的吗?请参阅我更新的问题 您是否确定在呈现 alertVC 时设置了delegate
?向警报控制器的 positive/negativeBtnPressed()
方法添加断点,以验证它们是否被调用并且 delegate
不为零。
@DavidGanster 我做到了。检查我更新的问题,你会看到。我在 AlertVC 上设置断点,它被调用,但是当对话框关闭时,在 MainViewController 上这个函数根本没有被调用。
@pmb 您没有表明您在任何地方设置了委托,只是表明您实现了协议。你能把你在MainViewController
中设置myAlertVC.delegate = self
的代码贴出来吗?
@DavidGanster 我没有设置我忘记了。现在它工作得很好。非常感谢你。我将其标记为最佳答案。【参考方案2】:
你必须 CTRL + 将按钮从你的应用 Storyboard 拖到他们自己的方法中。
您的 IFOButton 应该是 UIButton 派生类(继承)。
即使你只需要一种方法来做到这一点
@IBAction internal func handleButtonTap(_ sendder: UIButton) -> Void
if sender === alertPositiveBtn
// Do something positive here
else
// Do something negative here
【讨论】:
以上是关于单击一个按钮时如何发送事件的主要内容,如果未能解决你的问题,请参考以下文章
如何从带有 2 个按钮的表单单击按钮时发送 Ajax 请求?