单击一个按钮时如何发送事件

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
    

【讨论】:

以上是关于单击一个按钮时如何发送事件的主要内容,如果未能解决你的问题,请参考以下文章

如何从qtablewidget检测单元格中单击的按钮

c#中如何写单击一个按钮执行另一个按钮的事件!求正确答案!

如何从带有 2 个按钮的表单单击按钮时发送 Ajax 请求?

可拖动按钮时如何将单击事件设置为禁用?

仅在单击指定按钮时如何启动 DropDownList SelectedIndexChanged 事件?

如何通过单击按钮启动倒数计时器事件?