【问题标题】: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

标签: ios iphone swift uibutton swift3


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2021-12-21
    • 2012-03-14
    • 2014-06-28
    • 2023-04-02
    相关资源
    最近更新 更多